summaryrefslogtreecommitdiff
path: root/glib
diff options
context:
space:
mode:
authorDan Nicholson <dbn.lists@gmail.com>2014-02-03 15:41:27 -0800
committerDan Nicholson <dbn.lists@gmail.com>2014-02-03 15:41:27 -0800
commit90320817dc06052de780b406ad74db22845835ba (patch)
treeae82c1f24b63dac48c60110819da8e0707202d30 /glib
parente1d44d2362061a4cbd002ce059f1ac9dd78d971a (diff)
downloadpkg-config-90320817dc06052de780b406ad74db22845835ba.tar.gz
glib: Update snapshot version to 2.38.2
This is the latest stable release from upstream. Patches have been refreshed, including putting the removal of most pkg-config checks into the glib-only patch. A few more files, most notably the large NEWS file, have also been removed from the repo to keep the size of the snapshot down.
Diffstat (limited to 'glib')
-rw-r--r--glib/.gitignore5
-rw-r--r--glib/Makefile.am13
-rw-r--r--glib/Makefile.decl97
-rw-r--r--glib/NEWS6351
-rw-r--r--glib/README.in35
-rw-r--r--glib/configure.ac781
-rw-r--r--glib/glib-gettextize.in188
-rw-r--r--glib/glib.mk225
-rw-r--r--glib/glib/Makefile.am50
-rwxr-xr-xglib/glib/abicheck.sh13
-rw-r--r--glib/glib/deprecated/gallocator.h6
-rw-r--r--glib/glib/deprecated/gcache.c6
-rw-r--r--glib/glib/deprecated/gcache.h6
-rw-r--r--glib/glib/deprecated/gcompletion.c36
-rw-r--r--glib/glib/deprecated/gcompletion.h6
-rw-r--r--glib/glib/deprecated/gmain.h6
-rw-r--r--glib/glib/deprecated/grel.c18
-rw-r--r--glib/glib/deprecated/grel.h6
-rw-r--r--glib/glib/deprecated/gthread-deprecated.c36
-rw-r--r--glib/glib/deprecated/gthread.h9
-rw-r--r--glib/glib/docs.c97
-rw-r--r--glib/glib/galloca.h10
-rw-r--r--glib/glib/garray.c113
-rw-r--r--glib/glib/garray.h55
-rw-r--r--glib/glib/gasyncqueue.h26
-rw-r--r--glib/glib/gatomic.c70
-rw-r--r--glib/glib/gatomic.h22
-rw-r--r--glib/glib/gbacktrace.c3
-rw-r--r--glib/glib/gbacktrace.h8
-rw-r--r--glib/glib/gbase64.c18
-rw-r--r--glib/glib/gbase64.h12
-rw-r--r--glib/glib/gbitlock.c5
-rw-r--r--glib/glib/gbitlock.h6
-rw-r--r--glib/glib/gbookmarkfile.c37
-rw-r--r--glib/glib/gbookmarkfile.h46
-rw-r--r--glib/glib/gbytes.c16
-rw-r--r--glib/glib/gbytes.h20
-rw-r--r--glib/glib/gcharset.c12
-rw-r--r--glib/glib/gcharset.h10
-rw-r--r--glib/glib/gcharsetprivate.h32
-rw-r--r--glib/glib/gchecksum.c357
-rw-r--r--glib/glib/gchecksum.h25
-rw-r--r--glib/glib/gconvert.c328
-rw-r--r--glib/glib/gconvert.h60
-rw-r--r--glib/glib/gdataset.c542
-rw-r--r--glib/glib/gdataset.h38
-rw-r--r--glib/glib/gdate.c4
-rw-r--r--glib/glib/gdate.h53
-rw-r--r--glib/glib/gdatetime.c123
-rw-r--r--glib/glib/gdatetime.h53
-rw-r--r--glib/glib/gdir.c154
-rw-r--r--glib/glib/gdir.h34
-rwxr-xr-xglib/glib/gen-unicode-tables.pl1
-rw-r--r--glib/glib/genviron.c20
-rw-r--r--glib/glib/genviron.h37
-rw-r--r--glib/glib/gerror.c1
-rw-r--r--glib/glib/gerror.h20
-rw-r--r--glib/glib/gfileutils.c233
-rw-r--r--glib/glib/gfileutils.h65
-rw-r--r--glib/glib/ggettext.c20
-rw-r--r--glib/glib/ggettext.h12
-rw-r--r--glib/glib/ghash.c124
-rw-r--r--glib/glib/ghash.h43
-rw-r--r--glib/glib/ghmac.h6
-rw-r--r--glib/glib/ghook.h29
-rw-r--r--glib/glib/ghostutils.h11
-rw-r--r--glib/glib/giochannel.c55
-rw-r--r--glib/glib/giochannel.h83
-rw-r--r--glib/glib/giounix.c14
-rw-r--r--glib/glib/giowin32.c12
-rw-r--r--glib/glib/gkeyfile.c11
-rw-r--r--glib/glib/gkeyfile.h55
-rw-r--r--glib/glib/glib-init.c8
-rw-r--r--glib/glib/glib-init.h12
-rw-r--r--glib/glib/glib-mirroring-tab/gen-mirroring-tab.c6
-rw-r--r--glib/glib/glib-private.c10
-rw-r--r--glib/glib/glib-private.h21
-rw-r--r--glib/glib/glib-unix.c177
-rw-r--r--glib/glib/glib-unix.h33
-rw-r--r--glib/glib/glib.h2
-rw-r--r--glib/glib/glib.py15
-rw-r--r--glib/glib/glib.symbols1665
-rw-r--r--glib/glib/glibintl.h2
-rw-r--r--glib/glib/glist.c141
-rw-r--r--glib/glib/glist.h43
-rw-r--r--glib/glib/gmacros.h51
-rw-r--r--glib/glib/gmain-internal.h6
-rw-r--r--glib/glib/gmain.c1134
-rw-r--r--glib/glib/gmain.h147
-rw-r--r--glib/glib/gmappedfile.c26
-rw-r--r--glib/glib/gmappedfile.h14
-rw-r--r--glib/glib/gmarkup.c72
-rw-r--r--glib/glib/gmarkup.h27
-rw-r--r--glib/glib/gmem.c122
-rw-r--r--glib/glib/gmem.h43
-rw-r--r--glib/glib/gmessages-private.h35
-rw-r--r--glib/glib/gmessages.c559
-rw-r--r--glib/glib/gmessages.h43
-rw-r--r--glib/glib/gnode.c3
-rw-r--r--glib/glib/gnode.h40
-rw-r--r--glib/glib/gnulib/Makefile.am13
-rw-r--r--glib/glib/gnulib/vasnprintf.c5
-rw-r--r--glib/glib/goption.c80
-rw-r--r--glib/glib/goption.h32
-rw-r--r--glib/glib/gpattern.c15
-rw-r--r--glib/glib/gpattern.h12
-rw-r--r--glib/glib/gpoll.h7
-rw-r--r--glib/glib/gprimes.h7
-rw-r--r--glib/glib/gprintf.h15
-rw-r--r--glib/glib/gqsort.h7
-rw-r--r--glib/glib/gquark.c361
-rw-r--r--glib/glib/gquark.h24
-rw-r--r--glib/glib/gqueue.h46
-rw-r--r--glib/glib/grand.c6
-rw-r--r--glib/glib/grand.h22
-rw-r--r--glib/glib/gregex.c2971
-rw-r--r--glib/glib/gregex.h475
-rw-r--r--glib/glib/gscanner.c20
-rw-r--r--glib/glib/gscanner.h31
-rw-r--r--glib/glib/gscripttable.h8
-rw-r--r--glib/glib/gsequence.c12
-rw-r--r--glib/glib/gsequence.h43
-rw-r--r--glib/glib/gshell.c29
-rw-r--r--glib/glib/gshell.h10
-rw-r--r--glib/glib/gslice.c13
-rw-r--r--glib/glib/gslice.h20
-rw-r--r--glib/glib/gslist.c66
-rw-r--r--glib/glib/gslist.h40
-rw-r--r--glib/glib/gspawn-win32-helper.c79
-rw-r--r--glib/glib/gspawn-win32.c31
-rw-r--r--glib/glib/gspawn.c193
-rw-r--r--glib/glib/gspawn.h96
-rw-r--r--glib/glib/gstdio.c52
-rw-r--r--glib/glib/gstdio.h23
-rw-r--r--glib/glib/gstrfuncs.c53
-rw-r--r--glib/glib/gstrfuncs.h54
-rw-r--r--glib/glib/gstring.c50
-rw-r--r--glib/glib/gstring.h46
-rw-r--r--glib/glib/gstringchunk.h12
-rwxr-xr-xglib/glib/gtester-report2
-rw-r--r--glib/glib/gtester.c45
-rw-r--r--glib/glib/gtestutils.c1414
-rw-r--r--glib/glib/gtestutils.h140
-rw-r--r--glib/glib/gthread-posix.c38
-rw-r--r--glib/glib/gthread-win32.c5
-rw-r--r--glib/glib/gthread.c70
-rw-r--r--glib/glib/gthread.h48
-rw-r--r--glib/glib/gthreadpool.c9
-rw-r--r--glib/glib/gthreadpool.h20
-rw-r--r--glib/glib/gthreadprivate.h7
-rw-r--r--glib/glib/gtimer.c8
-rw-r--r--glib/glib/gtimer.h17
-rw-r--r--glib/glib/gtimezone.c1401
-rw-r--r--glib/glib/gtimezone.h16
-rw-r--r--glib/glib/gtrashstack.h6
-rw-r--r--glib/glib/gtree.c9
-rw-r--r--glib/glib/gtree.h22
-rw-r--r--glib/glib/gtypes.h12
-rw-r--r--glib/glib/gunibreak.h986
-rw-r--r--glib/glib/gunichartables.h15
-rw-r--r--glib/glib/gunicode.h83
-rw-r--r--glib/glib/gunicodeprivate.h5
-rw-r--r--glib/glib/gunicollate.c29
-rw-r--r--glib/glib/gunicomp.h62
-rw-r--r--glib/glib/gunidecomp.h7443
-rw-r--r--glib/glib/guniprop.c16
-rw-r--r--glib/glib/gurifuncs.c7
-rw-r--r--glib/glib/gurifuncs.h10
-rw-r--r--glib/glib/gutf8.c14
-rw-r--r--glib/glib/gutils.c781
-rw-r--r--glib/glib/gutils.h60
-rw-r--r--glib/glib/gvariant-core.c48
-rw-r--r--glib/glib/gvariant-core.h7
-rw-r--r--glib/glib/gvariant-internal.h9
-rw-r--r--glib/glib/gvariant-parser.c43
-rw-r--r--glib/glib/gvariant-serialiser.c4
-rw-r--r--glib/glib/gvariant-serialiser.h9
-rw-r--r--glib/glib/gvariant.c208
-rw-r--r--glib/glib/gvariant.h124
-rw-r--r--glib/glib/gvarianttype.c13
-rw-r--r--glib/glib/gvarianttype.h36
-rw-r--r--glib/glib/gvarianttypeinfo.h10
-rw-r--r--glib/glib/gversion.h7
-rw-r--r--glib/glib/gversionmacros.h147
-rw-r--r--glib/glib/gwakeup.c15
-rw-r--r--glib/glib/gwakeup.h12
-rw-r--r--glib/glib/gwin32.h41
-rw-r--r--glib/glib/libcharset/Makefile.am12
-rwxr-xr-xglib/glib/libcharset/config.charset32
-rw-r--r--glib/glib/valgrind.h4840
-rw-r--r--glib/glib/win_iconv.c14
-rw-r--r--glib/m4macros/Makefile.am2
-rw-r--r--glib/m4macros/attributes.m4288
-rw-r--r--glib/m4macros/glib-gettext.m41
-rw-r--r--glib/m4macros/glibtests.m428
-rwxr-xr-xglib/mkinstalldirs162
196 files changed, 19768 insertions, 19814 deletions
diff --git a/glib/.gitignore b/glib/.gitignore
index a19c655..f80afbc 100644
--- a/glib/.gitignore
+++ b/glib/.gitignore
@@ -17,6 +17,10 @@ TAGS
*.sourcefiles
*.stp
*.exe
+*.def
+*.test
+*.log
+*.trs
# autofoo stuff here
compile
@@ -35,6 +39,7 @@ glib-gettextize
glib-zip
gtk-doc.make
py-compile
+test-driver
INSTALL
README
diff --git a/glib/Makefile.am b/glib/Makefile.am
index 95c71de..583b914 100644
--- a/glib/Makefile.am
+++ b/glib/Makefile.am
@@ -1,5 +1,5 @@
## Process this file with automake to produce Makefile.in
-include $(top_srcdir)/Makefile.decl
+include $(top_srcdir)/glib.mk
# http://people.gnome.org/~walters/docs/build-api.txt
.buildapi-allow-builddir:
@@ -18,20 +18,21 @@ AM_CPPFLAGS = \
EXTRA_DIST += \
acglib.m4 \
README.in \
- Makefile.decl \
- mkinstalldirs
+ glib.mk \
+ $(NULL)
# These may be in the builddir too
-BUILT_EXTRA_DIST = \
- README
+BUILT_EXTRA_DIST += \
+ README \
+ $(NULL)
CONFIGURE_DEPENDENCIES = acglib.m4
# build documentation when doing distcheck
DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man --disable-maintainer-mode
-DISTCLEANFILES = config.lt
+DISTCLEANFILES += config.lt
distclean-local: lcov-clean
if test $(srcdir) = .; then :; else \
diff --git a/glib/Makefile.decl b/glib/Makefile.decl
deleted file mode 100644
index 50cf169..0000000
--- a/glib/Makefile.decl
+++ /dev/null
@@ -1,97 +0,0 @@
-# GLIB - Library of useful C routines
-
-#GTESTER = gtester # for non-GLIB packages
-GTESTER = $(top_builddir)/glib/gtester # for the GLIB package
-GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package
-
-# initialize variables for unconditional += appending
-EXTRA_DIST =
-TEST_PROGS =
-
-### testing rules
-
-# test: run all tests in cwd and subdirs
-test: test-nonrecursive
-if OS_UNIX
- @ for subdir in $(SUBDIRS) . ; do \
- test "$$subdir" = "." -o "$$subdir" = "po" || \
- ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \
- done
-
-# test-nonrecursive: run tests only in cwd
-test-nonrecursive: ${TEST_PROGS}
- @test -z "${TEST_PROGS}" || G_DEBUG=gc-friendly MALLOC_CHECK_=2 MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) ${GTESTER} --verbose ${TEST_PROGS}
-else
-test-nonrecursive:
-endif
-
-# test-report: run tests in subdirs and generate report
-# perf-report: run tests in subdirs with -m perf and generate report
-# full-report: like test-report: with -m perf and -m slow
-test-report perf-report full-report: ${TEST_PROGS}
- @test -z "${TEST_PROGS}" || { \
- case $@ in \
- test-report) test_options="-k";; \
- perf-report) test_options="-k -m=perf";; \
- full-report) test_options="-k -m=perf -m=slow";; \
- esac ; \
- if test -z "$$GTESTER_LOGDIR" ; then \
- ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \
- elif test -n "${TEST_PROGS}" ; then \
- ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \
- fi ; \
- }
- @ ignore_logdir=true ; \
- if test -z "$$GTESTER_LOGDIR" ; then \
- GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \
- ignore_logdir=false ; \
- fi ; \
- if test -d "$(top_srcdir)/.git" ; then \
- REVISION=`git describe` ; \
- else \
- REVISION=$(VERSION) ; \
- fi ; \
- for subdir in $(SUBDIRS) . ; do \
- test "$$subdir" = "." -o "$$subdir" = "po" || \
- ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \
- done ; \
- $$ignore_logdir || { \
- echo '<?xml version="1.0"?>' > $@.xml ; \
- echo '<report-collection>' >> $@.xml ; \
- echo '<info>' >> $@.xml ; \
- echo ' <package>$(PACKAGE)</package>' >> $@.xml ; \
- echo ' <version>$(VERSION)</version>' >> $@.xml ; \
- echo " <revision>$$REVISION</revision>" >> $@.xml ; \
- echo '</info>' >> $@.xml ; \
- for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \
- sed '1,1s/^<?xml\b[^>?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \
- done ; \
- echo >> $@.xml ; \
- echo '</report-collection>' >> $@.xml ; \
- rm -rf "$$GTESTER_LOGDIR"/ ; \
- ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \
- }
-.PHONY: test test-report perf-report full-report test-nonrecursive
-
-.PHONY: lcov genlcov lcov-clean
-# use recursive makes in order to ignore errors during check
-lcov:
- -$(MAKE) $(AM_MAKEFLAGS) -k check
- $(MAKE) $(AM_MAKEFLAGS) genlcov
-
-# we have to massage the lcov.info file slightly to hide the effect of libtool
-# placing the objects files in the .libs/ directory separate from the *.c
-# we also have to delete tests/.libs/libmoduletestplugin_*.gcda
-genlcov:
- rm -f $(top_builddir)/tests/.libs/libmoduletestplugin_*.gcda
- $(LTP) --directory $(top_builddir) --capture --output-file glib-lcov.info --test-name GLIB_PERF --no-checksum --compat-libtool
- LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory glib-lcov --title "GLib Code Coverage" --legend --show-details glib-lcov.info
- @echo "file://$(abs_top_builddir)/glib-lcov/index.html"
-
-lcov-clean:
- -$(LTP) --directory $(top_builddir) -z
- -rm -rf glib-lcov.info glib-lcov
- -find -name '*.gcda' -print | xargs rm
-
-# run tests in cwd as part of make check
-check-local: test-nonrecursive
diff --git a/glib/NEWS b/glib/NEWS
deleted file mode 100644
index 0495565..0000000
--- a/glib/NEWS
+++ /dev/null
@@ -1,6351 +0,0 @@
-Overview of changes from GLib 2.32.3 to 2.32.4
-==============================================
-
-* Bugs fixed:
- 639771 g_dir_read_name() can also return NULL on error
- 660851 Breakage of code due to changes in the GThread...
- 666386 Empathy doesn't open Redirect URI with particu...
- 671545 Constify collect and lcopy strings in GTypeVal...
- 672329 memory leaks in gutils.c and glib tests
- 672548 g_utf8_validate: @str shouldn't end up annotat...
- 672889 GLib.utf8_validate does segfault
- 673253 Not strict enough autconf test for libelf
- 674452 SEGFAULT in gio contenttype test
- 674777 What's the (transfer) of g_variant_lookup()?
- 675309 gkeyfile: Fix annotations for g_key_file_load_...
- 675446 gfile: Plug memory leak in g_file_make_directo...
- 675832 Incomplete gsettings bash auto-completion
- 676265 GNetworkMonitor leaks a lot of memory
- 676277 Document that g_app_info_create_from_commandli...
- 676397 g_environ_* should work with NULL envp
- 676594 [Patch] fix g_reload_user_special_dirs_cache
- 676816 Add more GLIB_AVAILABLE_IN_*
- 677235 Clarify the comment at the top of gmarshal.list
- 677782 Install bash completion files in /usr/share
- 677817 g_key_file_to_data adds extra blank lines in so...
- 677952 Missing annotation for GDBusConnection signal "...
- 678052 g_wakeup_acknowledge is called too often.
- 678066 gdbus codegen does not work with python3
- 678273 unicode othercasing is wrong in gregex
- 678333 gdbus-codegen code causes warnings under -Wfloa...
- 678758 GTlsInteraction unlocks an unlocked mutex
- 678881 Test failures in /socket/timed_wait in some cas...
- 678941 /contenttype/guess test case failure
- 678944 gio returns the wrong default applications for ...
- 678949 wrong definition of ulong_bool for 64 bit big e...
- 678959 /mainloop/timeouts race condition: assertion fa...
- 679258 The 'Since' tag for G_SOURCE_CONTINUE and G_SOU...
- 679671 Misc fixes for g_dbus_node_info_new_for_xml
- 679813 Documentation bug on http://developer.gnome.org...
-
-
-Overview of changes from GLib 2.32.2 to 2.32.3
-==============================================
-
-* Bug fixes:
- Correct a typo in the ELF configure check
- Reset LIBS after the ELF configure check
- Fix GIO/GObject Visual C++ projects
- gio: fix error handling in async case of GProxy...
- GConverterInputStream: fix an infinite loop...
-
-* Translation updates:
- Bulgarian
- Catalan
- Czech
- German
- Japanese
- Slovenian
- Telugu
-
-
-Overview of changes from GLib 2.32.1 to 2.32.2
-==============================================
-
-* GApplication: can now have a NULL application ID
-
-* g_clear_object: fix warnings when using it on C++ (due to lack of
- ability to implicitly cast void*)
-
-* GDBus:
- - add our own implementation of the message bus for use on Windows only
- - fix up a few bugs that use of this bus uncovered in GDBus
- - escape nonce files in dbus addressess (think 'c:\')
- - support initial underscores in dbus codegen namespace (for private)
-
-* Fix misdetection of GNUstep as Cocoa (for the MacOS GSettings backend)
-
-* make sure configure fails if AC_CHECK_ALIGNOF cannot detect the alignment
-
-* GAppInfo: overwrite the DISPLAY only if it is set in the launch context
-
-* glib/tests/date: force US locale running the GDateTime tests
-
-* GSocketControlMessage: Don't warn about unknown messages
-
-* Resources:
- - fix broken use of GVDB on big endian machines
- - set a 'display name' so that pretty file names appear in Gtk CSS
- warning messages
-
-* GMainContext:
- - block child sources when blocking the parent
- - introduce more testcases for child sources
-
-* Translations updates:
- Brazilian Portuguese
- French
- Galician
- Italian
- Lithuanian
- Polish
- Polish
- Serbian
- Simplified Chinese
- Spanish
-
-* Bug fixed:
- 619026 avoid warning in gutils.h when using gcc with -Wconversion
- 669260 Open/Save dialog hangs waiting for data with libsoup
- 671249 GApplication: Allow a null application_id?
- 672786 goa-daemon: action in notification doesn't work
- 673409 g_resource_lookup_data may return stale data pointer
- 674172 glib-2.32.1 misdetects GNUstep as Cocoa
- 674345 cssprovider: Make sure to print out file name in css warnings
- 674483 broken configure results when cross-compiling with gcc >= 4.5
-
-Overview of changes from GLib 2.32.0 to 2.32.1
-==============================================
-
-* Bugs fixed:
- 670254 glib-2.30.2: Fails /GDateTime/new_from_unix test
- 672541 glib-compile-resources prepends --sourcedir to absolute paths
- 673139 URL to mailing lists in README incorrect
- 673174 g_input_stream_read[_finish]: document returning 0 on EOF
- 673191 glib/gchecksum.c warning: dereferencing type-punned pointer...
- 673216 [W32] gtestutils does not use path separators consistently
- 673439 Properly deprecate g_value_{set,get}_char
- 673612 Fails to decode dictionaries wrapped in two layers of array
- 673803 gclosure: Support return values of GVariants
- 669285 glib/tests/markup-parse fails under non-english locale
- 673911 gio-2.0.pc lists full path to executables, breaking cross com..
- 673762 gnextstepsettingsbackend.c:343: error: parse error before 'in'
-
-* Updated translations:
- Belarusian
- British English
- Bulgarian
- Catalan
- Czech
- French
- German
- Hebrew
- Hindi
- Hungarian
- Italian
- Japanese
- Kannada
- Latvian
- Lithuanian
- Marathi
- Norwegian bokmål
- Odia
- Polish
- Serbian
- Slovenian
- Spanish
- Swedish
- Telugu
-
-
-Overview of changes from GLib 2.31.22 to 2.32.0
-===============================================
-
-* Bugs fixed:
- 671988 Quickly registering / unregistering objects on bus...
- 672095 glib needs stable sort function
- 672406 glib/tests/include.c fails to build on FreeBSD
-
-* Updated translations:
- Telugu
-
-
-Overview of changes from GLib 2.31.20 to 2.31.22
-================================================
-
-* Bugs fixed:
- 531901 Use __builtin_bswap* for GUINT*_SWAP_LE_BE if building...
- 653167 Out of tree build is broken on windows
- 668973 Test /gvariant/parser fails on Solaris 10
- 669797 gvfs now lists its fuse mounts
- 670846 deadlock: GStreamer-WARNING **: wrong STREAM_LOCK count 0
- 671664 gio-querymodules: unlink instead of writing empty cache
- 671676 Glib can't be cross-compiled any more after merge of...
- 671918 gnome-shell is inaccessible unless started while an AT...
- 671942 GSocketMsgFlags: annotate as a flags
- 671997 Unix signal handling assumes that volatile 1-byte writes...
- 672013 GSimpleAsyncResult: support reliable cancellation
- 672026 default log output should include pid and/or prgname
- 672095 glib needs stable sort function
- 672201 G_SPAWN_SEARCH_PATH should continue on ENODEV and ETIMEDOUT
- 672239 request NO_REPLY from g_dbus_connection_call() with no as...
- 672249 gdbusproxy leaks asyncresult in an error case instead of...
-
-* Translation updates:
- Assamese
- British English
- Catalan
- Catalan (Valencian)
- Danish
- Esperanto
- Finnish
- French
- German
- Hungarian
- Korean
- Lithuanian
- Norwegian bokmål
- Polish
- Portuguese
- Russian
- Traditional Chinese
-
-
-Overview of changes from GLib 2.31.18 to 2.31.20
-================================================
-
-* Update to Unicode 6.1
-
-* Update PCRE to 8.30
-
-* Deprecations are now versioned, and new API is
- marked with the version it was introduced.
- Use these with GLIB_VERSION_{MIN,MAX}_REQUIRED
-
-* The performance of signal emissions has been
- improved for simple cases
-
-* Bugs fixed:
- 529806 Cannot build in 64-bit Mac OS X due to libiconv
- 580873 Documentation of register type functions incomplete
- 592666 Document how to unset an attribute
- 597785 g_type_class_add_private code snippet is a bad example
- 621368 glib-2.24.1: FAIL: run-assert-msg-test.sh when updating...
- 622149 --disable-regex breaks glib2 build
- 639873 GBinding: Crash when binding two properties on the same...
- 640202 For GLIB v. 2.23.6 and above: impossibility to build mu...
- 668295 Need a way to classify GVolume instances
- 669670 gasyncqueue: don't use deprecated g_cond_timed_wait()
- 670542 Add version information for deprecations
- 670557 gvaluetransform: Fix an infinite loop with GFlagsValue...
- 670721 global variable for signal ID should be hidden
- 670751 IceWM build fails due to the G_DEPRECATED_FOR macro
- 670909 g_dbus_connection_call leaks when it receives an error...
- 670922 Include path to gdbus-codegen in the pkgconfig file
- 670969 GSequence lookup may fail if there was no sort prior to...
- 671025 Constants and identifiers starting with a number are no...
- 671270 make distclean failures
- 671281 glib-compile-resources.xml is missing from the dist tar...
-
-* Translation updates:
- Basque
- Belarusian
- Brazilian Portuguese
- Bulgarian
- Galician
- Hebrew
- Lithuanian
- Persian
- Punjabi
- Serbian
- Simplified Chinese
- Slovenian
- Telugu
- Traditional Chinese
- Uyghur
- Vietnamese
-
-
-Overview of changes from GLib 2.31.16 to 2.31.18
-================================================
-
-* GDBusProxy has now a flag, G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
- which can be set to make GDBus automatically reload
- changed properties even if the propertychanged signal
- does not contain the new values.
-
-* GApplication puts non-unique applications on the bus
-
-* GApplication now has g_application_quit()
-
-* g_async_queue_timed_pop has been deprecated in favor of
- the new g_async_queue_timeout_pop, which uses relative
- delays in microseconds instead of a GTimeVal.
-
-* a huge number of API documentation fixes
-
-* Bugs fixed:
- 647986 put non-unique apps on D-Bus
- 658484 vpn connection vs NetworkSecretDialog
- 664237 GDateTime falls back to UTC if TZ is set
- 669329 gthread-win32: update for g_get_monotonic_time() changes
- 669330 glocalfile: fix error code when opening a directory on win32
- 669372 glib/tests memory leaks.
- 669412 mem leak in g_environ_unsetenv
- 669538 Fix compilation of glib-compile-resources.c on Windows
- 669544 gdbus-codegen example introspection XML is not complete
- 669595 glib-mkenums: fix handling of forward enum declarations
- 669670 gasyncqueue: don't use deprecated g_cond_timed_wait()
- 669671 gobject: use #pragmas to avoid deprecated function warnings
- 669689 Retrieve cwd and environ in local GApplicationCommandLine
- 669810 socket/win32: flush pending read before signaling HUP
- 669865 g_regex_fetch()
- 670085 memory leak in g_output_stream_write_async
- 670138 gbytes.h is missing the G_BEGIN/END_DECL guards
- 670485 Simplify session API (shared bug with gtk+)
-
-* Updated translations:
- Belarusian
- Danish
- Galician
- Serbian
- Telugu
- Hebrew
-
-
-Overview of changes from GLib 2.31.14 to 2.31.16
-================================================
-
-* GResource:
- - The resource compiler can now convert pngs into
- pixel data that can be used without parsing at runtime
- (requires gdk-pixbuf-pixdata to be present)
-
-* Bugs fixed:
- 669123 resource compiler: failing to-pixdata should...
- 669173 resource: fix xml preprocess entity handling
- 669224 Cross-compilation broken by data-to-c
- 669253 gsettings set buggy on array values
- 669334 fix memory leak in bookmark file parser
-
-* Translation updates:
- Norwegian bokmål
- Spanish
-
-
-Overview of changes from GLib 2.31.12 to 2.31.14
-================================================
-
-* GResource:
- - GLib now includes a commandline utility, gresource,
- to explore resources in ELF files
- - The resource compiler can now optionally strip
- ignorable whitespace from XML resources
- - The resource compiler can now generate build dependencies
- - The resource compiler will now autoselect output formats
-
-* GApplication:
- - The menu markup parser API has been dropped, the
- menu XML support lives in GTK+ now
-
-* GValueArray has been deprecated
-
-* Bugs fixed:
- 626258 N-ary Trees - 'nodes' can be inserted before and after...
- 634232 Core Dump / Aborted using g_key_file_to_data
- 639099 schema compiler chokes on valid schema
- 667228 Deprecate GValueArray
- 667243 Add an element clear function to GArray
- 667929 glib-compile-resources: xml resources doesn't need to...
- 668250 g_date_time_format() produces a non-UTF8 string
- 668468 'IP_ADD_SOURCE_MEMBERSHIP' undeclared
- 668532 resources: add dependency generator to the resource compiler
- 668539 resources: compiler should autoselect output format...
- 668561 gresource-tool not internationalized
- 668572 glib_cv_g_atomic_lock_free config.cache setting not honored...
- 668650 GRealArray->clear_func should be initialized
- 668756 GKeyFile: allow loading from empty strings
- 668857 fix couple of typos in comments
- 669024 goption: implement platform_get_argv0() for OpenBSD
-
-* Updated translations:
- Galician
- Norwegian bokmål
- Spanish
- Traditional Chinese
-
-Overview of changes from GLib 2.31.10 to 2.31.12
-================================================
-
-* GApplication:
- - Drop support for exporting menus - this functionality
- will be provided in GtkApplication
- - Add a way to create actions that change settings
-
-* Bugs fixed:
- 629503 Add async versions of g_unix_connection_{receive,send}_credentials
- 656301 glib-compile-schemas should not create an empty file
- 668071 mingw-gcc build fails on gio/gsocket.[c|h]
- 668118 the big appmenu switcheroo
- 668158 base64 encode and line termination
- 668163 GDBusConnection: note that exit-on-close is sometimes TRUE
- 668269 gsignal: add g_signal_handlers_disconnect_by_data
- 668279 create GAction from GSettings
-
-* Translation updates:
- Norwegian bokmål
-
-
-Overview of changes from GLib 2.31.8 to 2.31.10
-===============================================
-
-* GResource:
- - A new facility to allow linking data files into binaries
- and make them available as resources
- - Resources are compiled using glib-compile-resources
- - GIO supports resource:/// uris to access resources
-
-* Bugs fixed:
- 619126 Missing dependency libs
- 658315 g_key_file_get_keys() should set length to 0...
- 660371 is it ever valid to have 0 as a GError domain?
- 666700 Add some missing (allow-none) annotations
- 667375 GAsyncInitable subclassing (and async subclassing...
- 667447 Missing many introspection annotations
- 667790 Protect call to pthread_condattr_setclock with define
- 667938 wrong gtypes generated for empty flags enums
-
-* Translation updates:
- Hebrew
- Spanish
-
-
-Overview of changes from GLib 2.31.6 to 2.31.8
-==============================================
-
-* GObject:
- - The type checks for overriding properties have been loosened.
- In particular, it is now possible to add the CONSTRUCT flag
- to an overridden property
- - GWeakRef is a new API for weak references; unlike g_object_weak_ref
- and g_object_add_weak_pointer, it is thread-safe.
-
-* GHashTable has grown new convenience api for use as a set:
- g_hash_table_add, g_hash_table_contains
-
-* GSocketConnection has gained API for managing connection status
-
-* GSettings: a native OS X backend has been added, under the
- name 'nexstep'
-
-* Bugs fixed
- 455640 Something fishy with GRegex and unicode
- 548954 weak references are not threadsafe
- 625751 Add G_FILE_ATTRIBUTE_FILESYSTEM_USED
- 658871 gbacktrace: g_get_prgname () isn't called for a NULL argu...
- 664069 gvariant: Never break out of g_variant_iter_loop
- 664830 g_strescape doesn't natively handle \v (vertical tab)
- 665211 GDBusConnection singleton access can race with disposal
- 665805 Add GSocketClient::action, for tracking socket client status
- 666116 some tests provoke undefined behaviour, which is undesira...
- 666422 Unreachable code in gio gnetworkmonitornetlink.c
- 666551 Crash in g_thread_xp_SleepConditionVariableSRW
- 666595 menu parser disallows id='' on submenu and section
- 666615 loosen property override flag restrictions
- 666616 gobject: fix property override type checks
- 666803 g_utf8_validate() fails to validate strings with known size
- 666804 g_ateaxit deprecation warning in devhelp points in wrong ...
- 666951 g_mkdtemp: Since version incorrect in docs
- 666978 Fails to compile glib applications with ISO C90 compiler
- 667098 ginetaddressmask leaks its address property
- 667225 GSocket: add missing type checks to public methods
- 667226 GSocket: fix an error return value
- 667279 Sometimes crashes when launching commandline-crea...
- 667285 Wrong keyname listed in documentation for g_deskt...
- 667331 Use g_queue_free_full() convenience function
- 667420 GHashTable GDB pretty printing is broken
-
-* Updated translations
- Belarusian
- Bulgarian
- Hebrew
- Norwegian bokmål
- Norwegian Nynorsk
- Spanish
- Vietnamese
-
-
-Overview of changes from GLib 2.31.4 to 2.31.6
-==============================================
-
-* GApplication no longer has APIs for setting menus. Those have been
- moved to GtkApplication.
-
-* the GActionGroup import/export functionality has been decoupled from
- GApplication by the introduction of a new interface for the purpose of
- handling platform data: GRemoteActionGroup. This allows Gtk to
- properly deal with platform data (and gdk threads) on window actions.
-
-* lots of documentation improvements
-
-* bug fixes and a huge number of memory leak fixes
-
-* the test suite now passes on ARM and some of the GDBus testcase hangs
- we've been seeing have been resolved (although others could remain)
-
-* g_bytes_get_data() API changed: now includes 'size' out parameter
-
-* new g_queue_free_full() API similar to g_[s]list_free_full()
-
-* desktop files: use standard "Keywords" now, not "X-GNOME-Keywords"
-
-* gsettings commandline tool now has --schemadir option for schemas not
- installed in the usual place (ie: as part of plugins)
-
-* Bugs fixed:
- 643736 GApplication doesn't emit dbus signals on action updates
- 657433 g_queue_free_full() missing
- 664699 glib: documentation fixes
- 665737 acquire/release gdk threads lock on incoming dbus
- 665879 GBytes: add a size argument to g_bytes_get_data
- 666113 various leaks in GLib, GIO are visible in the regression tests
- 666115 various tests leak memory, obscuring real leaks in the library
- 666145 Doc could be more explicite that g_thread_init calls can be droped
- 666173 Configure warning - linux/netlink.h usability... no
- 666296 Race condition in g_thread_xp_get_srwlock
- 666415 Settings tools should allow specifying a schema directory
-
-* Translations updated:
- French
- Spanish
-
-Overview of changes from GLib 2.31.2 to 2.31.4
-==============================================
-
-* EXPERIMENTAL: Menu support has been added to GApplication. Menus
- are exported on the bus, alongside the actions that are already there.
- There have also been many related improvements to action group
- functionality.
-
- These new APIs are subject to changes in the coming releases. In
- particular, it seems somewhat likely that the APIs for registering
- menubars may change in order to accommodate windows with different
- types of menubars.
-
-* GDBusConnection previously directly dispatched destroy notifies when
- unregistering objects if the current main context was the same context
- the object was exported on. It now unconditionally dispatches these
- through an idle on the context.
-
-* Clean up Requires in pc files. Linking against GIO no
- longer drags in gmodule. This may require dependency
- fixes here and there.
-
-* Introduce GBytes, a data type for immutable, fixed-size
- byte sequences. This makes the pre-existing GBuffer
- API available outside GLib
-
-* GDBusInterfaceSkeleton can now be exported on multiple
- connections
-
-* Bugs fixed:
- 600161 Do not use static GTypeInfo and GInterfaceInfo
- 640077 GFileMonitor: Always send CHANGES_DONE_HINT after a move...
- 641720 Misleading definition for local_command_line() in GApplic...
- 648516 Little comment error and 2 useless lines of code
- 651997 Dummy backend for gapplication
- 652560 Test for g_ascii_strtod is failing
- 662208 failure to initialize a GInitable should be considered...
- 662718 GDBusInterfaceSkeleton should be able to export on multi...
- 663291 GBytes: Immutable, refcounted sequence of bytes
- 664406 Need context for a proper translation
- 664455 Build fixes for GLib GIT master (2.31.x)
- 664558 GDBusWorker.frozen has a value > 1 in a gboolean
- 664559 sys/wait.h not available on windows
- 664617 gdbus segfault error 4 in libgio-2.0.so.0.3102.0
- 664635 GMemory{Out,In}putStream _async functions break sub-class...
- 664809 Add command line option to gtester to allow skipping tests
- 665067 cryptic assertion failure if nonsensical flag combinations...
- 665184 Check ref. count before reffing/unreffing
- 665298 Add 'Requires.private: libpcre' to glib-2.0.pc
- 665391 update documentation around mainloops
- 665607 ./configure is there for fiddling with cross-compile enviro...
- 665634 g_dbus_node_info_new_for_xml() errors on unknown attributes...
- 665685 Add a #define for the max length of a Unicode decomposition
- 665733 GDBusConnection holds lock while calling destroynotify
-
-* Translation updates:
- Norwegian bokmål
- Spanish
-
-
-Overview of changes from GLib 2.31.0 to 2.31.2
-==============================================
-
-* Monotonic time is now properly supported on Windows
-
-* glib-mkenums: fix @ENUMPREFIX@ with /*< underscore_name=... >*/
-
-* EXPERIMENTAL: introduce new GSettingsSchema and GSettingsSchemaSource
- APIs for the convenience of plugin system authors and those who wish
- to introspect the contents of schemas. This API may change.
-
-* Improve the performance of GObject property notifies.
-
-* GDBus:
- - fix a race when unowning a name immediately after owning it
- - thread safety improvements on GDBusConnection
- - fixes for exit-on-close functionality
-
-* Deprecations:
- - add G_SIGNAL_DEPRECATED
- - don't use G_DISABLE_DEPRECATED masking for functions anymore
-
-* docs
- - tmpl/ is finally dead for glib
-
-* GIO:
- - GInetAddressMask: new type for internet address range matching
- - various GIO file and stream fixes
- - improvements to attribute and fileinfo handling
-
-Overview of changes from GLib 2.29/2.30 to 2.31.0
-=================================================
-
-This release contains a huge number of changes (500 commits worth). The
-list below attempts to summarise, but not every change is listed.
-
-* Major changes to threading and synchronisation
- - threading is now always enabled in GLib
- - support for custom thread implementations (including our own internal
- support for errorcheck mutexes) has been removed
- - a whole lot of dead code (to deal with the non-threaded case) has
- been ripped out. This includes the racy path of GMainContext that
- caused deadlocks with respect to child process exits in
- single-threaded programs (such as gtester).
- - libgthread is now an empty shell and g_thread_init() is no longer
- required (and has been deprecated)
- - GMutex and GCond can now be statically allocated without explicit
- initialisation. Dynamic allocation for these types is deprecated.
- - new types GRecMutex and GRWLock can also be statically allocated
- without explicit initialisation.
- - GPrivate can now be statically allocated and has an improved API.
- Dynamic allocation of GPrivate is deprecated.
- - GStaticMutex, GStaticRecMutex, GStaticRwLock, GStaticPrivate are
- deprecated.
- - GCond now uses monotonic time internally and a new API takes
- monotonic time for timed waits, deprecating the wallclock API
- - removal of the insane macro indirection used in the previous
- implementation of threading and synchronisation APIs
- - use SRWLock and CONDITION_VARIABLE APIs when available on Windows
- (Vista and later) and emulate them on XP
- - leaks of G(Static)Private-allocated data on some cases of thread exit
- have been fixed
- - simplified new thread creation API with the old API deprecated. The
- concept of joinability has disappeared (all threads are joinable) as
- have priority levels, 'bound'ness (ie: kernel vs. userspace threads)
- and ability to manipulate the stack size.
- - GThread is now a refcounted type
- - other implementation details changed
-
-* Move headers for some deprecated functionality to a separate
- deprecated/ directory.
-
-* New support for attribute-based deprecations to issue compiler
- warnings instead of breaking the build and/or giving warnings about
- implicit declarations (and possibly miscompiling).
-
-* GCache has been deprecated (after its last use was removed from our
- platform over a year ago).
-
-* It is no longer possible to include individual headers (like
- "ghash.h") -- you must #include <glib.h>.
-
-* The misguided experiment of allowing the program to stumble along with
- missing GSettings schemas is now over -- the abort is back.
-
-* Clarify that fork() is not valid while using GMainContext. This is
- because the internal resources of the GMainContext end up being shared
- by both processes. We had an assert here but it was breaking existing
- (valid) use cases as well, so it has been removed for now.
-
-* GApplication
- - add ::shutdown signal as logical dual to ::startup
- - don't use a GMainLoop: iterate the GMainContext directly (improves
- quit logic)
-
-* Several portability fixes for Windows, OpenBSD, Solaris
-
-* Add new GValue API to specifically deal in signed chars (in case the
- platform defines 'char' as unsigned)
-
-* some new API to mitigate the problems associated with calling setenv()
- in a multi-threaded program
-
-* Use CLOCK_MONOTONIC unconditionally if the libc has support at compile
- time (ie: stop checking for kernel support at runtime).
-
-* pkg-config files:
- - drop -uninstalled variants
- - remove gobject dependency on gthread
-
-* New macro G_ATOMIC_LOCK_FREE is defined if the atomic operations are
- implemented without use of a mutex. Cleaned up atomic-related
- compilation issues with mingw compilers on win32 systems.
-
-* SOCKS proxy and resolver improvements
-
-* Fix the spelling of G_IO_FLAG_IS_WRITABLE (was WRITEABLE) and
- introduce a macro for backwards compatibility.
-
-* GDBus:
- - many code generation updates and improvements
- - some race condition fixes, including testcase hangs
-
-* GVariant:
- - new g_variant_new_from_fixed_array() API
- - substantial docs improvements/clarifications
-
-* GKeyFile is now refcounted and boxed
-
-* mount monitoring is now based on /proc/mounts (where available)
- instead of mtab
-
-* new macros G_SOURCE_CONTINUE and G_SOURCE_REMOVE for returning from
- GSourceFunc (so you don't have to remember what TRUE and FALSE mean)
-
-* use xlocale functions where available to avoid too much heavy lifting
- in functions like g_ascii_strtod()
-
-* GMappedFile can now be created from an fd
-
-* error message strings grammar/i18n fixes
-
-* many docs updates
-
-* Partial list of bugs closed:
- 70598 Unify GStaticMutex and GMutex.
- 320888 optimization for g_main_context_wakeup
- 398418 GChildWatch race condition?
- 527214 g_timer_elapsed() returns random values
- 580505 add a way to set/get name for a thread
- 583511 race condition means g_main_loop_quit() does not work
- 590808 GKeyFile should have a refcount and a boxed type in GObject
- 592715 Document that g_str_hash() and g_int_hash() are not NULL safe
- 631413 Add macros for GSourceFunc return values
- 632049 not immediately clear what g_variant_get_fixed_array expects
- 640212 "Error stating file" is not a friendly message
- 640293 Use xlocale functions to implement g_ascii_strtod()
- 640975 Check that error exists before trying to set it
- 643934 GApplication lacking a logical dual for the ::startup signal
- 651268 assertion failed in GDBus worker thread
- 653987 g_key_file_get_integer cannot interpret trailing spaces
- 654412 Documentation for g_variant_get_child_value unclear
- 654563 info capplet: Failed to calculate disk space
- 655366 missing GSettings schemas lead to obscure crashes
- 656621 g_spawn_*() calls executables in current directory
- 656679 [gi] Add two annotations to gio
- 657992 Add glib__private__() API to share between glib,gio
- 658188 _set_as_last_used_for_type generates a broken mimeapps.list
- 658206 gsocks5proxy.c has invalid gettext use
- 658207 glib-compile-schemas says "can not"
- 658558 simpleaction: Fix documentation of :enabled
- 658683 clean up charset/language threading issues
- 658692 add introspection annotations to g_time_val_from_iso8601()
- 658715 Duplicite strings
- 658769 Invalid reuse of GError in GThreadedResolver
- 658806 sign error in string hash implementation
- 658976 gdbus-codegen's C namespace option needs to support Ugly_Case
- 659070 gdbus-codegen generated code segfaults when property changes
- 659082 gdbus-codegen: Single letter namespaces get dropped from names
- 659212 GMappedFile should fail on non-regular files
- 659324 _SPLICE_CLOSE_TARGET doesn't mark the output stream as closed
- 659423 Use adaptive mutexes when available
- 659427 Move deprecated code to a separate directory
- 659646 gdbus-codegen produce code that warnings at build
- 659690 Possible build warning in code generated by gdbus-codegen
- 659699 property name collision when generating code for "Connection"
- 659754 Add API to GMappedFile that allows to pass FD
- 659838 incorrect types in introspection for g_object_bind_property
- 659866 pthread_rwlock_t requires defined __USE_UNIX98
- 659870 gvalue: Fix signedness of g_value_get_char()
- 659889 glib-2.29.92/gio-2.0.pc.in has a wrong line.
- 659916 GObject size of 64K is not actively enforced
- 659920 Missing setter for read/write property 'closed' of GIOStream
- 659923 Add g_variant_new_fixed_array() function
- 660013 Remove old g_atomic configure cruft
- 660096 glib/rwlock tests failure (tests asserted)
- 660130 Possible loss of user data when updating mimeapps.list
- 660147 tracker causes g_critical in "gsettings list-recursively"
- 660413 Make G_ASSERT_STATIC work with clang
- 660498 Generated test code fails when the codegen changes
- 660511 Use /proc/mounts for monitoring mounts, not /etc/mtab
- 660536 Expose options for /etc/fstab entries
- 660635 Deprecate g_thread_foreach
- 660637 Pending dbus method calls not canceled on connection loss
- 660739 kill off g_{mutex,cond}_{new,free}()
- 660740 make GThread more standard
- 660741 g_cond_timedwait is a disaster
- 660743 macro wrappers for g_once_init_enter/leave
- 660744 finish killing g_thread_init()
- 660745 GPrivate leaks on Windows
- 660791 [gio] Improve doc for g_file_make_directory_with_parents()
- 660843 asyncqueue-test is broken
- 660849 Remove cruft from g_strerror and g_strsignal
- 660886 GDBusProxy: don't drop/complain about unknown props/signals
- 660887 g_slice_set_config() is broken
- 660994 Add g_main_context_ref_thread_default()
- 661255 gio: enable test_peer regression test for OpenBSD
- 661257 giomodules.c uses ":" instead of G_SEARCHPATH_SEPARATOR_S
- 661318 tests use pthread without appropriate compiler/linker flags
- 661421 Applications fail to initialize on GNU Hurd - commit
- 661438 Implement G_GNUC_DEPRECATED/G_GNUC_DEPRECATED_FOR on Visual C++
- 661711 Sorting keys for GDrive, GVolume and GMount instances
- 661763 desktop-app-info: Add support for X-GNOME-Keywords
- 661896 /gdbus/connection/life-cycle is racy
- 661914 Gstreamer/Totem locks up
- 662100 regression: g_dbus_connection_close() triggers exit-on-close logic
-
-* Translations updates:
- Belarusian
- Brazilian Portuguese
- British English
- Bulgarian
- Catalan
- Catalan (Valencian)
- Czech
- Danish
- Esperanto
- French
- Gujarati
- Hebrew
- Hungarian
- Italian
- Japanese
- Lithuanian
- Norwegian bokmål
- Oriya
- Polish
- Russian
- Serbian
- Simplified Chinese
- Slovak
- Slovenian
- Spanish
- Tamil
- Vietnamese
-
-Overview of changes from GLib 2.29.18 to 2.29.90
-================================================
-
-* API/ABI changes:
- - unix signal watches now match the API of all of the other sources
- - revert the addition of g_date_time_source_new () from last release
-
-* networking and other fixes for Solaris
- - we no longer support symbolic port names (ie: from /etc/services)
- - check if -lsocket is needed
- - fix g_socket_details_from_fd()
- - avoid getmntinfo
- - fix some harmless warnings
-
-* GDateTime improvements:
- - generally improved standards compliance (with C99)
- - support C99-specified format strings: %g, %G, %V, %c, %C, %w
- - consult the locale for the preferred 12-hour time format (%r)
- - drop support for non-standard %N and broken %W
- - better support for formatting non-POSIX (eg: Arabic) numerals
- - locale-related test case fixups, and fix some leaks
-
-* GTlsInteraction: add interaction method invocation guarantees
-
-* gdbus-codegen: post-process all interfaces when parsing >1 file
-
-* make GMainLoop, GMainContext and GSource boxed types
-
-* fix a race condition in the first use of g_get_monotonic_time()
-
-* lots gtk-doc cleanups
-
-* better intltool compatibility when generating pot file
-
-* avoid GCC-specific compiler options when not using GCC
-
-* Translation updates:
- Belarusian
- Brazilian Portuguese
- Canadian English
- Galician
- Indonesian
- Korean
- Lithuanian
- Norwegian bokmål
- Portuguese
- Spanish
- Swedish
-
-Overview of changes from GLib 2.29.16 to 2.29.18
-================================================
-
-* GDateTime is now respecting LC_TIME when formatting
-
-* GTimeZoneMonitor has been removed again
-
-* A new API for wallclock functionality has been added:
- g_date_time_source_new(). This API is still experimental
- and may be changed or removed before 2.30.
-
-* Bugs fixed:
- 628904 Add credential support for FreeBSD and fix a socket issue
- 650763 gdbus-codegen is broken with python 2.7
- 655129 GDateTime could provide api for implementing wall clocks
- 656341 gtlsconsoleinteraction.c uses getpass() which isn't avail...
- 656387 GCancellable can be used concurrently
- 656443 Make GTlsInteraction ask_password cancellable
- 656675 void functions should not return in glib 2.29.16
- 656772 g_variant_compare for uint64 incorrect
- 656914 Load GIO_EXTRA_MODULES first, and ignore duplicates
- 657083 The header langinfo.h is not available on all systems
- 657084 gfileutils: fix docs/annotations for temp file methods
- 657138 Some files missing in POTFILES.in
- 657206 GInputStream leaked in g_file_icon_load_async()
- 657243 g_cancellable_set_error_if_cancelled() documentation
- 657274 Use detected PYTHON variable as shebang for gdbus-codegen
- 657336 Speling fixes for glib found with codespell
- 657452 plural forms needed
- 657454 Translation comment needed
- 657540 Print out file:// URL to coverage HTML report after building
- 657593 g_test_trap_fork calls close(-1)
- 646082 Addresses from GSocket should be normalized before returning
- 657517 fix gio/tests/gdbus-peer on bsd
-
-* Translation updates:
- Brazilian Portuguese
- Galician
- Norwegian bokmål
- Punjabi
- Russian
- Serbian
- Spanish
- Swedish
- Traditional Chinese
- Uighur
-
-
-Overview of changes from GLib 2.29.14 to 2.29.16
-================================================
-
-* GTlsDatabase: an abstract class that provides support
- or certificate and key lookup. An implementation will
- be provided in glib-networking
-
-* GHmac: Support or HMAC digests
-
-* Misc new API:
- - g_ptr_array_add_full: creates a GPtrArray with
- a preallocated size and a destroy function
- - g_desktop_app_info_get_show_in: checks if a GDesktopAppInfo
- should be shown in a given desktop environment
- - g_mkdtemp, g_mkdtemp_full, g_dir_make_tmp: create
- temporary directories
-
-* Unify thread wakeup implementations of GMainContext
- and GCancellable, and use eventfd for it when available
-
-* Show mounts in $XDG_USER_DIR in addition to /media and $HOME
-
-* Bugs fixed:
- 636572 GTlsCertificateDB
- 644601 Some tests need a running dbus session
- 652284 deal with small key lengths
- 652827 glib-2.29.8 no longer builds with mingw.org's toolchain
- 653063 PEM parser fails parsing private key when put first
- 654078 Fail to static linking with Glib library
- 654450 New functions: g_ptr_array_new_full()
- 654793 Add G_VALUE_INIT
- 655044 GDesktopAppInfo: Add g_desktop_app_info_get_show_in()
- 655148 gdbusconnection is broken when compiling with mingw
- 655241 glocalfile.c no longer compiles with MinGW GCC
- 655598 g_cancellable_get_fd: silently return -1 for NULL cancellable
- 655664 gdbus should not abort if no dbus session is available
- 655769 Use ZLIB_CFLAGS when compiling gio
- 656031 Improve GVariant annotations
- 656048 glib-codegen requires Python >= 2.5
- 656151 configure test logic inverted, doesn't match comments
- 656152 GCC only syntax used, yet other compilers allowed by configure.
- 656162 allow use of lcov 1.9 for coverage
- 656282 GDBusProxy: uninitialized local variables can be freed
- 656283 Failing tls connection cause assertion
- 118563 Add g_mkdtemp in the spirit of g_mkstemp
- 636405 Add g_return_if_fail() to g_settings_bind_with_mapping()
- 656039 race condition between GDBusProxy signals and public API
- 656492 g_io_channel_new_file failure (open(2) behavior wrt POSIX)
-
-* Translation updates:
- Bulgarian
- Esperanto
- French
- Galician
- German
- Hebrew
- Indonesian
- Italian
- Norwegian bokmål
- Russian
- Spanish
- Swedish
-
-
-Overview of changes from GLib 2.29.12 to 2.29.14
-================================================
-
-* Unicode improvements
- - add g_unicode_script_{to,from}_iso15924
- - add G_UNICODE_SPACING_MARK define
- - more normalisation improvements
- - stop using deprecated g_unicode_canonical_decomposition()
-
-* GParamSpec:
- - mark the 'name' field as 'const' and add a comment to the header to
- help avoid future problems caused by bad hacks
-
-* Merge some (modified) patches from Debian:
- - 03_blacklist-directories.patch
- - add some blacklisted mount directories
- - 60_wait-longer-for-threads-to-die.patch
- - sleep longer in a test case, if needed to avoid failing
-
-* Units policy change: prefer use of SI units
- - deprecate g_format_size_for_display, add g_format_size(_full)
-
-* GSettings: don't call g_error() when the schema is missing
-
-* GVariant support for arrays of object paths:
- - new g_variant_{new,get,dup}_objv API
- - support for g_variant_{new,get} '^ao' and '^a&o' similar to '^as'
-
-* GDBus:
- - use new improved array-of-objects support and pass 'ao' as char**
- instead of GVariant*
- - improve handling of 'h' type (Unix file descriptor index)
-
-* GIO:
- - fix compilation without USE_STATFS and USE_STATVFS
-
-* Documentation fixes
-
-* Bugs fixed:
- 622921 Migrate from dbus-glib to glib's GDBus
- 648271 Add g_unicode_script_to_iso15924()
- 654948 Stop using deprecated g_unicode_canonical_decomposition()
- 654988 g_atomic_int_add should document behaviour change
- 655025 #define G_UNICODE_SPACING_MARK G_UNICODE_COMBINING_MARK
- 655076 normalization misses some Full_Composition_Exclusion=True.
-
-* Translations updated:
- Spanish
-
-Overview of changes from GLib 2.29.10 to 2.29.12
-================================================
-
-* Add new API to do Unicode (de-)composition in atomic steps,
- for use in Harfbuzz.
-
-* Bugs fixed:
- 615895 (indirectly) support non-NULL-terminated regexes in GRegex
- 617949 glib trunk fails to compile on Solaris w/ Studio 12...
- 620423 Document the possibility to unset attributes
- 627974 Floating reference headaches
- 644687 Not finding cross-links in current doc set
- 649246 g_output_stream_splice() cannot be used on 32-bit machines...
- 653841 a helper script to build glib from git master on win32
- 653935 g_slist_free_full/g_list_free_full iterates twice in the list
- 654017 tests: fix glib_translations_work() in gsettings unit test
- 654085 Don't needlessly use "echo -e" when creating .def files
- 654195 Add g_unichar_compose() and g_unichar_decompose()
- 654232 GCancellable eventfd problems
- 654394 suspicious use of floating references in GDBusInterfaceSkeleton
- 654536 GSettings: lift key name length restriction to 64
- 654627 GParamSpec: intern property names
- 654651 Better g_unicode_canonical_decomposition()
- 654917 Make g_cclosure_marshal_generic the default signal handler
-
-* Translation updates:
- Belarusian
- Finnish
- Korean
- Latvian
- Lithuanian
- Norwegian bokmål
- Turkish
-
-
-Overview of changes from GLib 2.29.8 to 2.29.10
-===============================================
-
-* New features:
- - g_desktop_app_info_get_nodisplay: a function that is required
- to port gnome-menus to GDesktopAppInfo
- - g_hash_Table_iter_replace: new function to replace a value
- while iterating over a hash table
- - g_utf8_substring: convenience API to extract substrings from
- UTF-8 strings
- - g_action_group_add_entries: convenience API for creating lots
- of actions quickly
- - Use eventfd instead of pipes for waking up main contexts and
- for cancellation when available
- - GMatchInfo is now a refcounted boxed type
-
-* API changes in GAction:
- - the 'set_state' entry in the GActionInterface vtable has been
- renamed to 'change_state
- - g_action_set_state has been renamed to g_action_change_state
- - the 'state' property has been changed to read-only
- - GSimpleAction can no longer be subclassed
-
-* Bug fixes
- 647796 g_variant_new_variant is not marked as constructor
- 652072 gmain: make use of signalfd()
- 652168 Crosscompiling Fails if build<=2.24 and host >2.24
- 652750 make dist fails
- 652758 GDataInputStream: Clarify g_data_input_stream_read_line docs...
- 652822 Add a g_hash_table_iter_replace
- 652897 tiny docs clarification for g_utf8_to_ucs4_fast
- 653140 gmain: use Linux eventfd() for main context wake up
- 653429 drop AM_MAINTAINER_MODE or enable it by default
- 653484 GAsyncCallbacks should default to allow-none
- Add missing fundamental types to the generic marshaller
-
-* Translation updates
- Belarusian
- Galician
- Russian
-
-Overview of changes from GLib 2.29.6 to 2.29.8
-==============================================
-
-* Bug fixes
- 646608 export_symbols variable for gio dynamic library is wrong
- 646635 Fix introspection of GLib
- 647930 Documentation: GDataInputStream _read_upto() version
- 651745 Switch to _ prefixing rather than G_GNUC_INTERNAL
- 651920 Improve qsort_r detection
- 651959 gbitlock: "asm goto" is not available in gcc < 4.5
- 651998 gdbus-codegen: Use relative Python imports
- 652000 Fix for gatomic.c on Windows/MSVC
- 652002 Proposal to clean up gvaluetransform.c for MSVC
- 652025 g_dbus_connection_register_object: error is not set...
- 652081 Typos in a GBinding warning message
- 652197 Improper handling of double values in GDBusMessage
- Fix a deadlock in gobject finalization
-
-* Translation updates:
- Czech
- Galician
- German
- Hebrew
- Norwegian bokmål
- Spanish
- Uighur
-
-
-Overview of changes from GLib 2.29.4 to 2.29.6
-==============================================
-
-* Atomic operations have been rewritten from scratch to make use
- of gcc builtins where possible. As a side-effect of this, calls
- to g_atomic_ API with explicit casts may now be problematic; if
- that happens to you, try first to remove the casts. Another
- side-effect of the rewrite is that g_atomic_int_exchange_and_add
- has been deprecated in favor of g_atomic_int_add.
-
-* A full set of atomic operations on pointers has been added,
- including bit locks in pointer-size locations.
-
-* Access to quarks is now lockless
-
-* GObject data scalability has been greatly improved
-
-* g_data_time_format now supports alternative digits and padding
-
-* Introspection improvements:
- - Add a boxed type for GVariantBuilder
- - Annotation fixes in GDBus, GVariant, g_base64_
-
-* Bugs fixed:
- 502560 g_rand_double_range returns 'inf'
- 612729 g_mkdir_with_parents can fail if the directory already exists
- 617491 g_once() implementation is inefficient
- 619418 Add a performance test for UTF-8 decoding functions
- 619435 Make g_utf8_to_ucs4_fast() yet faster
- 626549 G_STATIC_ASSERT_EXPR
- 631231 bitlock: Fix detection and usage of futexes with Bionic
- 632294 g_queue_remove() should return a boolean
- 640518 GMainLoop has quadratic complexity when all pollfd's...
- 642026 Race condition in g_static_private_free
- 646635 Fix introspection of GLib
- 648678 g_date_time_format(): support %O flags for localized numbers
- 649480 Use MSG_CMSG_CLOEXEC in recvmsg in gio/gsocket.c
- 649506 GTestFunc et al lacking Since tag
- 649657 Don't return gboolean for functions that throw
- 649775 glib-gio-gdbuscodegen-Makefile.patch
- 649915 gsettings accepts unquoted strings longer than two characters
- 649973 gthread: build unix tests only on unix
- 649988 gdbus-codegen: Drop dependency on argparse
- 650078 forkbomb building glib/tests/protocol
- 650211 Optimization in key file parsing
- 650236 Application over DBus implements action state incorrectly
- 650345 g_key_file_has_key_full: New function to fix g_key_file_has_key...
- 650458 reduce overhead in g_object_set/get_data
- 650459 hash table consistency while calling destroy notify funcs
- 650688 enforce rules about hash table modification
- 650823 expand the set of atomic ops
- 650874 codegen chokes on docs
- 650882 use stdout instead of stderr for informational messages
- 650884 fix compilation with gcc2
- 650885 implement glib credentials on OpenBSD (hackish)
- 650935 G_GNUC_MAY_ALIAS and atomic ops
- 651009 minor documentation fix
- 651034 Regarding g_cond_wait after g_thread_pool_push in gthreadedresolver
- 651133 race condition in GDBusConnection's emit_signal_instance_in_idle_cb
- 651141 hashtable infinite loop
- 651219 fix path to true(1) on OpenBSD
- 651223 Fix some compile warnings on OpenBSD
- 651327 Minor fixes for the gsocket API
- 651467 Add pointer sized bitlocks
- 651650 gdbus: Avoid busy wait loop
- 651725 gmain: Cleanups and a new test case
- 651745 Switch to _ prefixing rather than G_GNUC_INTERNAL
-
-* Updated translations:
- Catalan (Valencian)
- Esperanto
- Hebrew
- Hungarian
- Russian
- Spanish
-
-
-Overview of changes from GLib 2.29.2 to 2.29.4
-==============================================
-
-* GDBus:
- - Includes several new types to support modeling D-Bus
- objects and interfaces more fully, and also introduces
- an 'object manager' pattern:
- GDBusInterface, GDBusObject, GDBusObjectManager
- These interfaces have client-side implementations:
- GDBusProxy, GDBusObjectProxy, GDBusObjectManagerClient
- And server-side implementations:
- GDBusInterfaceSkeleton, GDBusObjectSkeleton, GDBusObjectManagerServer
- - The new gdbus-codegen utility uses these new classes
- to generate C code and documentation from D-Bus interface
- descriptions in XML
-
-* GTest:
- - There is now a g_test_fail() function to mark
- tests as failed
-
-* GDesktopAppInfo
- - Now has a binding-friendly filename property
- - Other new API to more fully expose desktop file contents:
- g_desktop_app_info_get_categories(),
- g_desktop_app_info_get_generic_name()
-
-* GHashTable:
- - Several optimizations to reduce space consumption of
- large hash tables, in particular tables that are used
- to store sets.
-
-* Unix-specific APIs:
- GLib now installs a separate header, glib-unix.h, that is
- meant to collect Unix-specific APIs. For now, it contains
- g_unix_open_pipe(), g_unix_set_fd_non_blocking() for dealing
- with pipes and fds, as well as APIs to create mainloop
- sources which can trigger callbacks on certain Unix
- signals (SIGTERM, SIGHUP, SIGINT).
-
-* Bugs fixed:
- 631379 GDBus nonce-tcp test failing
- 632631 GLib-CRITICAL **: g_variant_new_string: assertion `g_utf8_validate (string, -1, NULL)' failed
- 635694 gdbus aborting due to unauthorized socket in DBUS_SESSION_BUS_ADDRESS
- 637561 Crash when using G_DBUS_SERVER_FLAGS_RUN_IN_THREAD
- 642935 g_date_time_format() prints wrong value for %z and timezone -0800
- 643134 g_dbus_message_copy
- 644941 glib-unix: New Unix-specific API
- 646013 g_hash_table_remove_all_nodes optimization
- 646309 glib cannot be cross-compilled for mingw32
- 646435 GTimeZone doesn't seem to be thread-safe
- 646957 GIO chained calls don't work with a thread default context
- 647594 README link to mailing list is broken
- 647602 Cannot connect to remote message bus via TCP
- 647746 The GSocketService documentation is incomplete.
- 647826 API: gtester: Add g_test_fail()
- 647903 GDesktopAppInfo: Add g_desktop_app_info_get_categories()
- 648416 g_app_info_create_from_commandline ignores SUPPORTS_STARTUP_NOTIFICATION
- 648423 Support G_DEBUG=trap-warnings
- 648425 GDesktopAppInfo: Add "filename" property for bindings
- 648966 Update g_unichar_iswide and g_unichar_iswide_cjk
-
-* Updated translations
- Norwegian bokmål
- Spanish
- Turkish
- Uighur
-
-
-Overview of Changes from GLib 2.28.0 to 2.29.2
-==============================================
-
-* GApplication
- - The documentation has been enhanced and clarified
- - An opt-out for uniqueness has been added: G_APPLICATION_NON_UNIQUE
- - GApplication now syncs settings before g_application_run() returns
-
-* GDBus
- - Interface lookups are now happening in constant time
- - Signature checking and handling of various unexpected
- situations has been improved
-
-* GVariant
- - The format accepted by the GVariant parser has beend documented
- - GVariant accepts G_VARIANT_TYPE_VARDICT for a{sv}
-
-* GDateTime:
- - The return value of g_datetime_compare() has been fixed to
- match strcmp() semantics
- - In order to handle problems with changing timezones, a GTimeZoneMonitor
- has been added to GIO, and g_time_zone_refresh_local() can be
- called to update the cached information about the local timezone
-
-* GOption now uses /proc/self/cmdline to set the program name instead
- and only falls back to "<unknown>" if that is unavailable
-
-* GSettings:
- - The schema compiler now warns about references to non-existing schemas
-
-* Commandline utilities are now fully translated
-
-* Signals can now indicate that collecting their arguments must
- always happen, even in the absence of connected signal handlers,
- using the G_SIGNAL_MUST_COLLECT flag.
-
-* Bugs fixed:
- 635099 Memory leak in gdbus introspection when parsing xml
- 640489 $ and ^ do not match lines if G_REGEX_MULTILINE|G_R...
- 642042 Overriding GDBus org.freedesktop.DBus.Properties im...
- 642052 g_timeout_add(_seconds) cannot handle large intervals
- 642490 notify_desktop_launch() "g_variant_new_bytestring:...
- 613269 g_type_get_qdata() doesn't work as I expected on subtypes
- 624943 G_VALUE_NOCOPY_CONTENTS is undocumented
- 637738 object_interface_check_properties never actually executes
- 638185 GIOCondition should be annotated as "flags"
- 639478 GDBusServer's g_dbus_server_new_sync() function should just...
- 641755 Add g_settings_get/set_uint() helpers
- 641768 dconf gsettings backend silently drops writes if it can't...
- 642797 g_app_info_get_default_for_type() broken for subtypes
- 642825 Unnecessary assertion failure in g_option_context_parse()
- 642944 NULL key lookup using g_hash_table_lookup_extended()
- 643074 Incorrect documentation for g_socket_receive() and g_socket...
- 643197 g_application_id_is_valid docs imply no valid ids
- 643468 GApplication docs: Warn that handling "command-line" means...
- 643478 GApplication::local_command_line vfunc documentation seems wrong
- 643624 Can g_variant_unref() on an already free'd variant
- 643649 g_application_run() should say that argc/argv can be NULL
- 643780 shouldn't need to create an action group to use actions...
- 643795 g_timeout_add_seconds fires with intervals 1 second longer...
- 644309 Program name is not set when using GtkApplication
- 644428 Crash in failure section of g_markup_collect_attributes()
- 644465 undefined reference to `_usleep'
- 644552 g_timeout_add_seconds(1, ...) may have a latency of up to 2...
- 644607 Correct internal definition of C_()
- 645789 annotations for g_file_*_contents
- 646039 g_settings_list_children() returns child that cannot be opened
- 646310 Accept range with only min or max
- 646420 g_dbus_method_invocation_get_parameters() docs should say...
- 646843 occasional abort on autologin
- 646985 add G_APPLICATION_NON_UNIQUE flag
- 647579 gsettings: Implement reset-recursively
- 647600 gsettings description has typo
-
-* Translation updates
- Afrikaans
- Bulgarian
- Bengali India
- British English
- Bulgarian
- Catalan
- Czech
- Danish
- French
- Galician
- German
- Greek
- Gujarati
- Hebrew
- Hungarian
- Italian
- Japanese
- Korean
- Lithuanian
- Polish
- Portuguese
- Romanian
- Serbian
- Simplified Chinese
- Spanish
- Swedish
- Traditional Chinese
- Uighur
- Vietnamese
-
-
-Overview of Changes from GLib 2.27.93 to 2.28.0
-===============================================
-
-* Bugs fixed:
-641363 GInitable documentation isn't clear about that finalize...
-641395 Add more data about the origin application to the "Lau...
-641411 gdesktopappinfo signals lost if it's the session bus...
-641477 glib-mkenums uses unportable #! line
-641572 Add @EXEEXT@ to pkgconfig binary name
-641688 glib installs GSettings.html and gsettings.html
-
-* Translation updates:
- Galician
- Italian
- Korean
- Punjabi
-
-
-Overview of Changes from GLib 2.27.92 to 2.27.93
-================================================
-
-* Bugs fixed:
- 637013 gio/gdbusmessage.c fails to compile on Solaris
- 640192 Error creating a Gio.Settings object through py...
- 640261 Minimum version for external pcre needs to be..
- 640262 GActionGroup contains redundant TYPE macros
- 640436 Make load_user_special_dirs() resistant to non...
- 640695 g_key_file_load_from_file() mishandles a CR-LF...
- 640724 can't compile gio due to format string issues
- 640725 can't compile tests due to format string issue
- 640807 improve GVariant behaviour with invalid pointers
- 640823 wrong documentation for g_source_add_child_source
-
-* Translation updates:
- Bulgarian
- Galician
- Hebrew
- Norwegian bokmål
- Spanish
- Traditional Chinese
-
-
-Overview of Changes from GLib 2.27.91 to 2.27.92
-================================================
-
-* Update to Unicode 6.0
-
-* Update PCRE to 8.12
-
-* Bugs fixed:
- 637696 g_unix_connection_send_fd() doesn't work
- 638872 null settings backend bug
- 640042 GtkApplication's warning about not connecting...
-
-* Translation updates:
- Arabic
- Basque
- Estonian
- Greek
-
-Overview of Changes from GLib 2.27.90 to 2.27.91
-================================================
-
-* Bugs fixed:
- 638838 gdesktopappinfo: Don't crash if we don't have a desktop filename
- 638894 Splitting on \s* gives no result
- 639064 Update gschema.dtd
- 639084 Copy/paste error in GSettings::writable-changed signal
- 639177 SIGSEGV for GApplications with G_APPLICATION_IS_SERVICE
-
-* Translation updates:
- Estonian
- Galician
- Indonesian
-
-
-Overview of Changes from GLib 2.27.5 to 2.27.90
-===============================================
-
-* Test reports created by gtester-report can now
- include revision information
-
-* The g_desktop_app_info_launch_* family of functions
- now emit a DBus signal when an application is launched.
- Additionally, there is a new variant
- g_desktop_app_info_launch_uris_as_manager(), which
- gives more control over the launched process.
-
-* The memory and null GSettings backends are now available
- as public API
-
-* g_get_locale_variants() is a new function that returns a
- list of variants of a locale identifier
-
-* Bugs fixed:
- 587898 I/O timeouts for GSocket
- 606960 gio: Add extension point for informing parties...
- 631980 Handle an optional <revision> node in the report...
- 634569 Document that g_variant_builder_add_value consumes...
- 635998 Make _g_compute_locale_variants public
- 636806 Add g_{memory,null}_settings_backend_get_default
- 637262 Need a binary DER version of ::accepted-cas
- 637544 Skip fsync() on btrfs
- 637720 void functions should not return a value.
- 637738 object_interface_check_properties never actually...
- 637759 GIOChannel: fix a crash in g_io_channel_read_chars()
- 637852 Updates to glib.vsprops file for MSVC 2008 builds...
- 637858 Updates to test/testglib.c...
- 638349 parameter name of g_variant_new_* may conflict...
-
-* Translation updates:
- Hebrew
- Norwegian bokmål
- Simplified Chinese
- Spanish
- Swedish
- Uyghur
- Vietnamese
-
-
-Overview of Changes from GLib 2.27.4 to 2.27.5
-==============================================
-
-* Network support:
- - Add g_tls_certificate_verify() to verify a certificate
- - Add GTlsConnection:use-system-certdb
- - Other TLS api additions
-
-* GIO:
- - Add g_io_stream_splice_async()/_finish() to splice two iostreams
- - Add g_emblemed_icon_clear_emblems() and make GEmblemedIcon derivable
- - Remove GPeriodic; it did not receive the necessary review and
- integration work to declare it stable
-
-* GSequence:
- - New methods g_sequence_lookup() and g_sequence_lookup_iter()
-
-* Bugs fixed:
- 617254 Missing g_sequence_lookup
- 632544 g_dbus_connection_send_message can not send a locked message...
- 633350 g_hostname_to_ascii() ignores non-ascii dots
- 634583 Better error reporting for g_variant_parse()
- 635007 gsetting enum rule don't work for out-of-srcdir builds
- 635626 GDBus message idle can execute while flushes are pending
- 636100 Can't read GSettings:backend property
- 636305 Typo on g_queue_remove_all() function description
- 636311 appinfo: tweak application positioning for content-types
- 636351 g_simple_async_result_is_valid lacks a version tag
- 636387 gdb autoload files shadow the "dir" builtin
- 636673 g_simple_async_report_error_in_idle should allow object...
- 637147 Add a "delay-apply" property to GSettings
- 637171 emblemedicon: add g_emblemed_icon_clear_emblems()
- 637237 gapplication: plug a memory leak
-
-* Translation updates:
- Estonian
- Galician
- Hebrew
- Norwegian bokmål
- Simplified Chinese
- Spanish
- Traditional Chinese
- Vietnamese
-
-
-Overview of Changes from GLib 2.27.3 to 2.27.4
-==============================================
-
-* GIO
- - Mounts are treated as hidden if they have a path element
- that starts with a dot
- - GAppInfo gained API to differentiate between recommended
- and fallback mime handlers
- - g_cancellable_create_source: creates a GSource that triggers
- when the GCancellable is canceled
- - GPollableInput/OutputStream: Interfaces for pollable streams
- - TLS support has landed, with an extension point that is
- implemented in glib-networking
-
-* GLib
- - Mainloop sources can now have 'child sources'
- - g_get_runtime_dir: New function to return the XDG_RUNTIME_DIR
-
-* Bugs fixed:
- 530786 GFileMonitor "changed" signal underdocumented
- 588189 TLS support for GSocket*
- 630357 g_object_new_valist uses uninitialized memory
- 630559 typo in public string in gsocks: 'The SOCKSv5 require...
- 632445 Documentation refers to removed GNOME 2.0 porting guide
- 634239 Child GSources
- 634241 Add pollable input/output streams
- 634504 allow passing a NULL emblem to g_emblemed_icon_new()
- 634613 unsufficient g_get_user_runtime_dir() documentation
- 635640 schema should inherit gettext-domain from schemalist
- 635768 Protect g_file_monitor_set_rate_limit() against negative...
- 635882 Fix the wrong-category schema test
- 635187 Wrong type of GVariant received in an action...
-
-* Updated translations:
- Galician
- Italian
- Norwegian bokmål
- Uyghur
-
-
-Overview of Changes from GLib 2.27.2 to 2.27.3
-==============================================
-
-* The GTimeSpec type that was introduced in the 2.27.2 has been
- dropped again in favour of APIs that return microseconds as
- 64-bit integer.
- Affected functions:
- g_source_get_time
- g_periodic_unblock
- g_get_monotonic_time
- g_get_real_time
- The similar GTimeVal struct is still around, but its use is
- discouraged.
-
-* GTimer is now using monotonic time unconditionally
-
-* There are some new functions to facilitate error reporting
- in async GIO APIs:
- g_simple_async_result_take_error
- g_simple_async_result_new_take_error
- g_simple_async_report_take_gerror_in_idle
-
-* There is new convenience API to us GVariant dictionaries:
- g_variant_lookup
-
-* It is now possible to delay sending match rules to the
- D-Bus daemon in GDBus:
- G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE
-
-* Support has been added for XDG_RUNTIME_DIR:
- g_get_user_runtime_dir
-
-* Various fixes for Win64/MSVC builds have been committed
-
-* Bugs fixed:
- 620263 Add g_clear_object, g_clear_pointer, g_clear_boxed
- 633075 update Project Files and sources for MSVC 2008/C89
- 633381 gsettings Makefile rules should handle empty list...
- 633685 Use g_simple_async_result_{new_,}take_error
- 633686 Add g_simple_async_report_take_gerror_in_idle
-
-* Translation updates:
- Belarusian
- Galician
- Hebrew
- Punjabi
- Spanish
-
-
-Overview of Changes from GLib 2.27.1 to 2.27.2
-==============================================
-
-* GApplication
- - Export actions over DBus and support activating them from remote instances
- - Support environment passing
-
-* GSettings
- - The gsettings utility has a list-recursively command
- - The gsettings utility has commandline completion for enum values
-
-* GLib is now linked against librt and uses monotonic time for
- timeouts and GPeriod sources. GSource has a new g_source_get_time()
- which returns monotonic time, and g_source_get_current_time() has
- been deprecated
-
-* Bugs fixed:
- 158725 free linked list with data
- 626320 GVariant: Avoid locking in g_variant_get_child_value() if possible
- 629247 add gsimpleasyncresult methods to take over a GError
- 629274 GNetworkService does not do fallback when there is no SRV record
- 631264 gsettings-tool choice/range support
- 631482 g_date_time_from_instant: 1000000000000000000
- 632169 docs for manual use of gsettings-data-convert
- 632571 Add equivalent to gconftool-2's -R option
- 633115 GSettings m4 doesn't fail the build for broken schemas
- 633206 Default g_application_local_command_line() doesn't set exit_status...
- 633339 support more complex gapplication setups
- 633356 Make timeout G_MAXINT mean "no timeout"
-
-* Translation updates:
- Catalan (Valencian)
- Indonesian
- Japanese
-
-
-Overview of Changes from GLib 2.27.0 to 2.27.1
-==============================================
-
-* GDateTime now has full week number support.
- New API: g_date_time_get_week_numbering_year
-
-* The GSettings schema compiler will now skip over
- broken .xml schema files instead of aborting altogether
-
-* GSettings now works properly on bigendian systems
-
-* GSettings has more complete support for ranges
- New API:
- g_settings_get_range
- g_settings_range_check
- The gsettings commandline tool supports ranges too.
-
-* GApplication has been rewritten; see the API docs for details
- and examples. The action support is not complete yet.
-
-* The GLib mainloop has gained 'dispatch to context' functionality,
- which can replace manually created idles in many cases.
- New API:
- g_main_context_invoke
- g_main_context_invoke_full
-
-* The gio-desktop-app-info-lookup extension point has been
- removed from GIO. GIO now uses x-scheme-handler mimetypes when
- looking for default applications.
-
-* On win32, make g_get_user_data_dir() return the CSIDL_LOCAL_APPDATA
- folder on Windows, and not CSIDL_PERSONAL. This matches what Qt does,
- and has been widely requested. Also make g_get_user_config_dir() return
- this and not the (roaming) CSIDL_APPDATA folder.
-
-* A periodic event clock has been added in GIO: GPeriodic. Note that this
- API is still experimental and expected to undergo changes before it
- will be incorporated into a stable GLib release. Use at your own risk.
-
-Bug fixes:
- 613822 gobject signal connect/disconnect not thread safe
- 618737 "dispatch to context" functionality
- 620710 g_get_user_data_dir() uses CSIDL_PERSONAL and not CSIDL_APPDATA
- 623400 acquire context before dispatching
- 627126 gsettings schema files don't get installed on FreeBSD
- 627171 g_socket_new_from_fd() doesn't set the right protocol
- 628876 Wrong error description
- 628937 gracefully handle broken schemas
- 629274 GNetworkService doesn't fallback when there is no SRV record
- 629289 g_error() used wrong, produces core dump
- 629687 leaks class refcount in gsocketcontrolmessage
- 629849 GLib-CRITICAL **: g_source_get_context: assertion `!SOURCE_...
- 629945 GDBus deadlock in g_bus_get_sync()
- 630000 g_date_time_difference
- 630077 GDateTime week number support
- 630185 Allow NULL strings in g_quark_try_string()
- 630797 docs mention non-existent g_object_dispose()
- 630968 gschema-compile problems on power g5
- 631263 GSettings needs range/choice APIs
- 631264 gsettings-tool choice/range support
- 631379 GDBus nonce-tcp test failing
- 631410 Port gapplookupgconf.c to using x-scheme-handler/
- 632884 Possible deadlock in g_object_remove_toggle_ref()
-
-Transation updates:
- Basque
- Brazilian Portuguese
- British English
- Bulgarian
- Czech
- Dutch
- Estonian
- French
- Galician
- German
- Greek
- Hebrew
- Hungarian
- Japanese
- Lithuanian
- Polish
- Portuguese
- Romanian
- Simplified Chinese
- Slovenian
- Spanish
-
-
-Overview of Changes from GLib 2.25.15 to GLib 2.27.0
-====================================================
-
-Build:
- - massive restructuring to reduce #include abuse
- - tweaks to silence some harmless compiler warnings
- - rename gschema-compile.c to glib-compile-schemas.c
- - Windows fixes
- - fix building with zlib < 1.2.4 on win32
-
-GDateTime:
- - better msgctxt for translating month and weekday names
- - API is changed quite a lot, implementation is improved
- - GTimeZone is now exposed
-
-GObject:
- - make ordering for overridden interface properties consistent
- - ->priv structures are limited to 64k but this was not documented,
- and exceeding this limit produced bad results. Add docs and enforce
- the limit properly.
- - add g_object_class_install_properties() to install multiple
- properties in one go
- - improve debugging output for GValue containing G_TYPE_STRV
-
-GIO:
- - fix priority sorting of GIO extensions
- - add GCredentials support on FreeBSD
- - fix support for IPv6 addresses in URI parsing functions
- - GSocketClient fixes for when g_socket_connect succeeds immediately
- - clarify string encoding for GFile constructors in docs
- - new functions g_data_input_stream_read_upto{,async,finish}
- - tweak confusing documentation for g_output_stream_write()
-
-GDBus:
- - GDBusMessage can now be locked and copied (like in libdbus)
- - GDBusConnection filter function API has changed again
- - GDBusServer: ::new-connection now declares if the connection was claimed
- - add a partial workaround for GObject bug 627724.
- - very many memory leaks fixed
-
-GVariant:
- - check for size == 0 in g_variant_get_bytestring to avoid a crash
- when attempting to get_bytestring() from an empty array
- - improve gobject-introspection annotations
-
-GSettings:
- - add GSettings Windows registry backend
- - some internal tweaks to the backend API
- - remove g_settings_list_items
- - add g_settings_list_children and _list_keys to replace it
- - add schema compiler restrictions for dealing with lists
- - don't automatically emit value changed signals on writability
- changes
-
-Other:
- - constify the 'parser' vtable param to g_markup_parse_context_push()
- - plug many memory leaks in test cases
-
-Bugs closed:
- 50076 Time API to go with date API
- 584284 g_data_input_stream_read_until_async different from sync version
- 624546 Modification of GDBusMessage in filter function
- 626919 Let g_object_class_install_property() return the installed GParamSpec*
- 628029 GDateTime missing get_week_of_year method
- 628253 Interface properties not listed in a consistent order
- 628331 Plug lots of mem leaks in gio test suite
- 628345 Plug a mem leak
- 628436 Plug a mem leak
- 628505 Fix building with zlib < 1.2.4 on win32
- 628839 [PATCH] datetime: Rename shadowing variables
- 628904 [PATCH] Add credential support for FreeBSD and fix a socket issue
- 628952 incorrect glib_major_version and other variables on cygwin.
- 629192 g_strdup_value_contents(): dump GStrv more usefully
- 629251 g_socket_client_async_connect_complete: assertion failed
- 629259 Failed to connect to "::1"
- 629328 g_markup_parse_context_push doesn't respect const structs
- 629429 month "May" short and full form same with "GDateTime" msgctxt
- 629689 GDBusConnection leaks its GCredentials
- 629698 Segfault in g_variant_get_bytestring()
-
-Updated translations:
- Arabic
- Armenian
- Basque
- British English
- Czech
- Finnish
- Galician
- German
- Hungarian
- Indonesian
- Japanese
- Lithuanian
- Norwegian bokmål
- Polish
- Portuguese
- Punjabi
- Simplified Chinese
- Slovenian
- Spanish
- Swedish
- Swedish
- Traditional Chinese
-
-Overview of Changes from GLib 2.25.14 to GLib 2.25.15
-=====================================================
-
- * GIO
- - Memory leak fixes
- - The GZip(De}Compressor can now process header information
- - Support for network proxies has been added, with the GProxy
- interface and the gio-proxy-resolver extension point. GIO
- includes SOCKSv4 and SOCKSv5 implementations, and libproxy
- is also going to provide an implementation of this extension
- point.
- - There are GAction and GActionGroup interfaces now, which will
- be used in GApplication in the near future.
-
- * GObject
- - There are now convenience macros for defining boxed and
- pointer types
-
- * GDBus
- - Memory leak fixes
- - GDBusProxy for well-known names can now auto-restart
- the service if the name owner disapperas
- - Filter functions are now allowed to modify messages
-
- * GLib
- - GDateTime is a replacement for GDate that supports time
- and timezone information.
-
- * Bugs fixed:
- 50076 Time API to go with date API
- 449565 Add G_DEFINE_BOXED_TYPE()
- 617691 Add GZIP header processing to GZlibCompressor/GZlibDecompressor
- 622184 add g_memory_output_stream_steal_data
- 624546 Modification of GDBusMessage in filter function
- 627088 Build failure in gdbus-peer.c on FreeBSD
- 627181 save a memdup
- 627182 Plug a mem leak in the gdbus-connection test
- 627187 Plug some gdbus mem leaks
- 627188 gdbus-non-socket test occasionally fails
- 627252 G_OPTION_FLAG_NO_ARG is only for callback options
- 627392 gdbus commit 8a3a4596 breaks win32 compile
- 627407 FTBFS on !linux UNIX platforms
- 627604 String error: 'that' twice in a row
- 627969 ABR in g_file_open_tmp
- 628084 gdbus-peer fails with assertion
- 628193 Miscellaneous string fixes
- 628296 abort() in gsocketconnection.c
- 628309 Plug a mem leak in GConverterOutputStream
- 628317 GEmblemedIcon:equal implementation is buggy
- 628323 Fix invalid reads
- 628327 Plug a mem leak
- 628328 Plug a mem leak
- 628329 Don't leak the FD list
- 628324 Invalid reads in gdbus-export test
-
- * Updated translations:
- British English
- Danish
- Galician
- Hebrew
- Punjabi
- Serbian
- Spanish
- Traditional Chinese
-
-
-Overview of Changes from GLib 2.25.13 to GLib 2.25.14
-=====================================================
-
-* GDBus
- - Make the closure variants of GDBus apis work
- - Make error unregistration work
- - Use async IO in the IO thread (626748)
-
-* GIO
- - Make g_simple_async_result_is_valid work without source (626208)
- - GSocketClient: add a timeout property
- - Fix memory leaks in GSocketClient
- - Handle async vs. sync correctly in GSocketConnection stream (616458)
- - Declare stream base classes as abstract
- - Clarify semantics of g_output_stream_write() (627071)
-
-* Other
- - Improve test coverage for GDBus, GRegex, GAsyncResult
- - Drop dead code in pcre, xdgmime
- - Fix a race condition in gtester (578295)
- - Avoid an extra allocation in GAsyncQueue (626704)
- - Add test case for non-socket GIOStream (626841)
- - More explicit GVariant docs (622770)
- - Imroved docs for GAsyncInitable and GSimpleAsyncResult (602417)
-
-* Translation updates:
- - Galician
- - Norwegian bokmål
- - Punjabi
- - Simplified Chinese
- - Swedish
-
-
-Overview of Changes from GLib 2.25.12 to GLib 2.25.13
-=====================================================
-
-+-------------------------------------------------------------------+
-| WARNING: There have been no breaks in API or ABI. Weird, eh? |
-+-------------------------------------------------------------------+
-
-The primary purpose of this release is to fix a serious problem with
-glib 2.25.12: glibconfig.h (as generated on a Fedora amd64 system) was
-being distributed in the tarball. It was being used to build some parts
-of glib on other systems (eg: 32bit ones). This was causing some very
-serious problems.
-
-There have been many other improvements, however:
-
- Build and testing:
- - vastly improved test coverage
- - old tests moved to the gtester framework
- - gtester Makefile modified so that the tests only run once
- - cleanup of how we handle includes while building glib
-
- GVariant:
- - add a g_return_if_fail (utf8) to g_variant_new_string()
-
- GDBus:
- - perform extra sanity checks when serialising messages
- - add API to query and set the byteorder of a GDBusMessage
- - improve debug output, add some extra options
- - if exiting due to the bus disconnecting us, print an error message
- explaining why
- - sort property names correctly
- - don't bother sending RemoveMatch when we will close the connection
- anyway
- - use effective uid/gid for credential passing
-
- GSettings:
- - add G_SETTINGS_BIND_INVERT_BOOLEAN for inverting boolean bindings
- without mapping functions
- - mark all strings in the schema compiler for translation
-
- Binding:
- - improve closure support for bindings
- - copy GSettings INVERT_BOOLEAN flag
-
- Other:
- - fix another complicated GCancellable deadlock possibility
-
-Bugs closed:
- 599590 glib build doesn't look for correct pkg-config
- 619026 avoid warning in gutils.h when using gcc with -Wconversion
- 624739 Please fix POTFILES.in
- 625472 Valgrind claims uninitialized bytes used
- 625500 g_date_set_time_val documentation doesn't mention local time
- 625628 GDBusProxy: wrong property name sorting
- 625753 Incorrect flags used in g_dbus_connection_call_sync()
- 625827 Expand documentation about error quark naming
- 625988 builddir != srcdir issues
- 626107 glibconfig.h is being disted
-
-Updated translations:
- French
- Galician
- Hebrew
- Norwegian bokmål
- Spanish
-
-
-Overview of Changes from GLib 2.25.11 to GLib 2.25.12
-=====================================================
-
-+-------------------------------------------------------------------+
-| WARNING: There have been many API changes in GDBus -- sending |
-| messages, subscribing to signals, closing connections and |
-| registering subtrees are affected. The ABI for GSettingsBackend |
-| has also been changed. For both reasons, a new dconf release is |
-| required (and will be along soon). |
-+-------------------------------------------------------------------+
-
-Build:
- - cleanup automake setup
- - rename configure.in to configure.ac
- - various docs fixups
- - move glibconfig.h to glib/
- - disable dtrace support on Mac OS (which has incompatible 'dtrace')
-
-GSettings:
- - add support for vendor override files (to change the default values
- in a schema)
- - change GSettingsBackend vtable
- - add g_settings_reset()
- - support binding to G_TYPE_STRV properties
-
-GDBus:
- - many bug fixes, including a serialisation fix
- - stop handling incoming connections as soon as stop() is called
- - proper support for file descriptor passing
- - new flags parameter for sending messages
- - new flags parameter for subscribing to signals
- - always reset the message serial when sending a message unless
- G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL is given
- - constness fixes for introspection structures
- - clean ups to subtree registration API
-
-Other:
- - fix divide by zero bug in g_malloc_n functions
- - GIO: don't blindly assume that SOCK_CLOEXEC is supported
- - make GObject property notify freezes threadsafe
- - GIO: clean up credentials passing
- - GApplication: make default-quit not apply if register=FALSE
- - GIO: add annotations for gobject-introspection
-
-Bugs closed:
- 166020 use GAtomic for refcounting
- 617483 Credentials passing
- 622005 [GApplication] no way to modify the "default-quit" property
- 623293 vendor override files
- 623810 Message serialization bug
- 623815 Don't check sender for GDBusProxy objects where name is not set
- 624473 GDBusSubtreeIntrospectFunc return type
- 624483 GDBusSubtreeEnumerateFunc clarification
- 624484 GDBusSubtreeDispatchFunc clarification
- 624754 gdbusaddress.c missing sys/wait.h
- 624968 div by zero in g_malloc_n family
- 624991 GSettings mapping for G_TYPE_STRV
- 625383 Add missing GI annotations
-
-Updated Translations:
- Armenian
- Galician
- German
- Hebrew
- Kazakh
- Romanian
- Simplified Chinese
- Spanish
-
-Overview of Changes from GLib 2.25.10 to GLib 2.25.11
-=====================================================
-
-+-------------------------------------------------------------------+
-| WARNING: There have been minor API changes in GDBus and GVariant. |
-| These API changes will not affect many users, but they do require |
-| a new version of GTK+ to be installed. |
-+-------------------------------------------------------------------+
-
-Build:
- - add a --disable-Bsymbolic configure flag to disable linking with
- -Bsymbolic-functions
- - this release sees the complete removal of the old 'g*alias' hacks
- - honour the NOCONFIGURE environment variable from autogen.sh
- - use proper feature test macros for isnan
- - use pkg-config to check for zlib
- - add ACLOCAL_AMFLAGS to Makefile.am
-
-GDBus:
- - hide Class and instance structures for all GDBus types except
- GDBusProxy. This breaks API by preventing subclassing, but probably
- nobody was doing that.
- - add new GDBusConnection call to support flushing all pending
- outgoing messages
- - change the register_object API to add a reference to the
- GDBusInterfaceInfo object so the caller need not keep it alive
- themselves
- - don't rewrite the serial number when sending messages that already
- have a serial number
- - better error checking for DBUS_SESSION_BUS_ADDRESS environment
- variable
- - switch to g_parse_debug_string for G_DBUS_DEBUG and add a lot of new
- flags
- - add support for temporarily freezing a freshly created
- GDBusConnection. Do this until after the ::new-connection signal
- has finished running on GDBus services.
- - never require non-closed connections (the user is incapable of doing
- this due to the obvious race)
- - remove weird/misleading redundant check on NameOwnerChanged signal
- - emit GDBusProxy::g-properties-changed on NameOwnerChanged
-
-GVariant:
- - the 'g_variant_{new,get}_byte_array' APIs have been removed
- - g_variant_{new,get,dup}_bytestring has been added, with different
- arguments and different behaviour
- - g_variant_{new,get,dup}_bytestring_array has been added, doing
- essentially the same thing as the 'strv' functions, but with byte
- strings instead of utf8 strings
- - G_VARIANT_TYPE_BYTESTRING ('ay'), BYTESTRING_ARRAY ('aay') and
- STRING_ARRAY ('as') constants have been added
- - the undocumented behaviour that g_variant_get_strv() deserialised
- arrays of object paths or signature strings has been dropped
- - additional varargs support for converting bytestrings or bytestring
- arrays with ^ay ^aay ^&ay and ^a&ay
- - improved gobject-introspection annotation
- - fix a problem with GBuffer calling g_slice_free for the wrong type
- - fix leaks in the type inferencing code of the parser
-
-GSettings:
- - improved documentation
- - updated schema XML DTD, now xincluded into the docs
- - added support for schemas that extend other schemas (using the
- 'extends=' attribute). Values of keys in the base schema can be
- overridden using <override>.
- - added theoretical support for lists (using the 'list-of=' attribute)
- - lots of new tests
- - add support for flags (implemented similarly to enums)
- - add support for generating .enums.xml files to gsettings.m4:
- gsettings_ENUM_NAMESPACE = org.example.myapp
- gsettings_ENUM_FILES = ../path/to/*.h
- will generate org.example.myapp.enums.xml with mappings for all
- enums and flags in the specified .h files.
- - warn with g_message() if the 'memory' backend is used by default
- (ie: because no other GSettings backends are installed)
- - fix get_property() for GSettings::schema
- - command line tool: fix a bug that prevented non-basic values from
- being set due to a premature free
- - command line tool: bash completion support
- - chain up in _finalize
- - add a new g_settings_get_mapped API to read settings that require
- post-processing
- - retry with the translated or schema default value if the
- GSettingsBindGetMapping function fails
- - schema compiler: never fail due to empty schema directories (but
- warn)
- - peek rather than ref/unref the GEnumClass in the mapping function
- - schema compiler: compile *.enums.xml before *.gschemas.xml to ensure
- that we have all the enums that the schemas may reference
- - schema compiler: improve accuracy of line numbers in error reports
- - fix crashes in the keyfile backend caused by invalid group names in
- the keyfile
-
-Other:
- - always intern GBinding prop names
- - base64: remove asserts preventing conversion of empty strings
- - document NULL special-cases for GValueArray
- - GNode docs improvements
- - improve detection of 'system internal' mounts
- - fix leaks in the inotify GFileMonitor implementation
- - annotate all custom GIO GSources to improve debugging (e.g. using
- SystemTap)
-
-Tests:
- - Turn on glibc malloc checking features for make check
- - improvements for GSettings tests, plus new tests
- - improved tests for GKeyfile
- - new tests for GDir, GSList, GSList, GAppLaunchContext,
- CharsetConverter, GIcon, ...
- - move some tests to GTester (tree tests, uri tests)
- - generally, really an awful lot of new tests
- - don't try to allocate 2gigs of memory anymore for the array test
-
- 552363 g_value_array_{insert,prepend,append}'s special cases for NULL
- 561248 Improve return value description from g_node_prev/next_sibling()
- 570036 Add ACLOCAL_AMFLAGS to Makefile.am
- 576833 g_sprintf add a reference to g_strdup_printf
- 576854 g_strconcat() documentation should provide a hint about bad l10n
- 582227 reference: add other URI functions to 'URI Functions' section
- 599223 should provide g_spawn_* variants that take a GAppLaunchContext
- 610784 array test failing
- 613057 Leak in inotify GFileMonitor implementation
- 620536 Annotate all custom GIO GSource using g_source_set_name
- 620913 More control with G_DBUS_DEBUG
- 622124 implement flags
- 622127 GSettings extended key validation
- 622128 retry with default value for failed mapping
- 622294 More annotations for GVariant
- 622565 glib-compile-schemas fails when no schemas
- 622600 Fix missing prototype warning
- 622813 gsettings mapping & enum buglet
- 623142 Ensure ::new-connection runs before processing D-Bus messages
- 623143 Never require non-closed connections
- 623319 use g_parse_debug_string for dbus debug flags
- 623401 process enums first
- 623402 schema compiler reports wrong line numbers
- 623407 g_keyfile_settings_backend_new crashes with the key "/"
- 623473 zlib should be checked with pkg-config
- 623537 GDBusProxy has weird checking on NameOwnerChanged
- 623538 GDBusProxy::g-properties-changed emission for corner cases
- 623692 directory with file at multiple MLS levels may display empty
- 623720 gschema.dtd does not contain enum definitions
- 623770 quoting of expand_macro in gdesktopappinfo.c
- 623772 gdesktopappinfo.c, function child_setup
- 623780 g_unix_is_mount_path_system_internal
- 623954 g_settings_finalize
- 623955 Dubious return values
-
-Updated translations:
- Galician
- Hebrew
- Norwegian bokmål
- Spanish
-
-Overview of Changes from GLib 2.25.9 to GLib 2.25.10
-====================================================
-
-+----------------------------------------------------------------+
-| WARNING: There have been API changes in GDBus. Users of these |
-| APIs will need to be adapted. In particular, a new release of |
-| dconf is required to go along with this one. There has also |
-| been a change in the GSettings backend API used for keyfiles. |
-+----------------------------------------------------------------+
-
-* GDBus:
- - add direction parameter to filter functions (API change)
- - allow calling other interfaces with a GDBusProxy
- - padding added to class struct fields (ABI change)
- - fixes for closures-based functions
-
-* GVariant:
- - new is_floating() call
- - add g_value_take_variant() call (required for marshallers)
-
-* GSettings:
- - support for binding GParamSpecEnum properties
- - ifelse-style condition support for GLIB_GSETTINGS m4 macro
- - remove gsettings-schema-convert tool (now in GConf)
- - allow introspection of all installed schemas
- - allow introspection of the keys in a schema
- - rewrite keyfile backend (API change)
-
-* GNIO:
- - don't implicitly close GSocket until it is destroyed
- - windows fixups
-
-* Other:
- - allow GChecksum to take (NULL, 0) for data/length
- - GRelation and GCompletion are now deprecated
- - introduce G_PARAM_DEPRECATED and G_ENABLE_DIAGNOSTIC
- - add working directory to GApplication platform data
- - lots of documentation cleanups
- - PCRE updated to 8.02
-
-* Build:
- - the IA__g_* style symbol aliasing has been disabled and replaced with
- the -Bsymbolic-functions linker flag on platforms that support it.
- Please be on the watch for portability issues and report them to us.
- - many test cases have been moved to the GTester framework
- - lcov support has been added for tests
- - many windows fixes
-
-* Bugs fixed:
- 501057 lcov coverage suite and GLib integration
- 551271 deprecate GRelation
- 601686 Implement diagnostic mode
- 603309 GSocketOutputStream broken on Windows (?)
- 616718 GLIB_GSETTINGS macro can't be used conditionally
- 616855 GSocketConnection: don't close the socket if it's still reffed
- 618866 g_ptr_array_remove_index_fast memory leak
- 619878 keyfile backend calls keys_changed with invalid argument
- 619879 keyfile backend doesn't make use of expected_type
- 621092 Add with_closures() variants for bindings
- 621172 Cross compiling fails
- 621838 Actually add cwd to platform data
- 621945 Filter outgoing messages in GDBusConnection
- 621947 add g_value_take_variant
- 622038 GSettings: "It is a programmer error" documentation is unclear
- 622154 [patch] update documentation for g_application_new
- 622281 binding: Add SYNC_CREATE to the flags
- 622480 Improve documentation for g_strcmp0()
- 622554 g_error called if schema not installed
- 622601 Return interned strings from g_settings_list_keys
-
-* Translation updates:
- - Galician
-
-Overview of Changes from GLib 2.25.8 to GLib 2.25.9
-===================================================
-
-+----------------------------------------------------------------+
-| WARNING: There have been API changes in GDBus, GSettings and |
-| GApplication. Users of these APIs will need to be adapted. In |
-| particular, a new release of GTK+ is required to go along with |
-| this one. |
-+----------------------------------------------------------------+
-
-* GDBus
- - Use Gio's default async implementation
- - Fix proxy construction for objects with no properties
- - Fix error handling in synchronous initialization
- - Do not dispatch calls to unregistered objects
- - Add _with_closures alternative functions
- - Allow constructing GDBusProxy with well-known names
- - Remove GType parameters from GDBusProxy constructors
- - Nuke g_bus_watch_proxy API
- - Add --xml to gdbus-tool to print raw introspected XML
-
-* GSettings
- - schema file format change: store (default, options) in gvdb
- - Add g_settings_sync()
- - Add support for enums and ranges
- - 'context' support has been replaced by direct use of
- GSettingsBackend
-
-* GApplication
- - Switch to using variants for timestamps
- - Use GInitable
-
-* GObject
- - Introduce g_object_notify_by_pspec
- - Add GBinding
- - The GVariant gtype G_TYPE_VARIANT was changed from boxed
- to fundamental. We believe there were no existing users
- of the boxed type, so this should not cause any applications
- to break.
-
-* Test framework
- - Add package and version to the test report XML
- - Use optparse to parse gtester-report commandline
- - Add subunit support to gtester-report
- - Prevent division by zero if no tests
-
-* Bugs fixed:
- 621782 Crash using gbinding
- 619945 GConverterOutputStream triggers assertion and corrupts data
- 621319 more leaked GVariants in GSettings
- 621168 GKeyFile memory leak on Windows platform
- 621002 Switch to using variants for timestamps, split out signals
- 620953 tiny docs addition
- 618904 Lies in gunixmounts documentation
- 621702 Correctly initialize GError
- 611778 minor cleanup of gtester-report
- 621213 GDBusProxy and well-known names
- 621034 Rewrite apps test to ensure children are killed
- 620954 gapplication gvariant simplifications
- 611869 add subunit out feature to gtester-report
- 621119 GDBusProxy and objects with no properties
- 620990 Use Gio's default async implementation again
- 620952 g_application_register_with_data is an ugly API
- 621252 GSettings leaks context
- 618715 fork() in GSettings test cases is problematic 618715
- 621905 Assume a ref when doing async work
- 621266 GSettings "context" clarification
-
-* Translation updates:
- Chinese
-
-
-Overview of Changes from GLib 2.25.7 to GLib 2.25.8
-===================================================
-
-* Initial support for dtrace and systemtap profiling:
- - mainloop sources can be named
- - probes for memory allocation with g_malloc and gslice
- - gquark name tracking
- - type creation
- - object life-cyle (creation, finalization, ref, unref)
- - signal creation and emission
-
-* GVariant
- - has been fixed to work with the FreeBSD malloc
- - added introspection annotations
- - new function: g_variant_builder_add_parsed
-
-* GSettings:
- - g_settings_set/get_strv functions have lost their length parameter
- - g_settings_set_strv accepts NULL
- - added introspection annotiations
-
-* GPermission: an abstract interface for representing permissions,
- with a minimal implementation named GSimplePermission
-
-* GApplication: a basic application support class, with a D-Bus based
- implementation
-
-* Bugs fixed:
- 619585 glib-compile-schemas asserts on FreeBSD
- 620384 Annotate GVariant and GSettings _strv() functions
- 606044 Add support for dtrace/systemtap static markers
- 620350 add g_variant_builder_add_parsed() API
- 620349 utf8ify GVariant printer
- 620767 Typo in GSettings documentation: "INTLTOOL_NOMERGE_RULE"
- 620312 Fix g_settings_[gs]et_strv() API
- 620519 GPermission
- 620582 GPermission needs a simple implementation
- 620496 GSettings schema compiler should reject invalid paths
- 620173 missing single header inclusion guards
- 620265 g_assertion_message_error should take const GError *
-
-* Translation updates:
- Esperanto
- Galician
- Hebrew
- Indonesian
- Norwegian bokmål
- Slovenian
- Spanish
-
-
-Overview of Changes from GLib 2.25.6 to GLib 2.25.7
-===================================================
-
-* NOTE: API/ABI breaks since 2.25.6 release:
- - g_dbus_connection_sync{,_sync} takes a new 'reply_type' argument
- - GSettingsBackendClass 'list' virtual function changed
-
- GSettings backends and things using GDBus may need to be rebuilt.
-
-* GDBus: many build-related fixes
-
-* GDBus (service): return a DBus error when receiving a method call for
- an unknown interface.
-
-* GSettings: fix 'make install' bug in gsettings.m4 for generated schema
- files
-
-* GSettings: avoid non-portable use of LC_MESSAGES
-
-* better approach to handling man pages
-
-
-* Bugs fixed:
- 619527 please improve docs on g_file_make_symlink
- 619391 send-with-reply should have expected result signature
- 618616 Use stack-allocated GVariantBuilders
- 617004 Build with "--disable-nls" fails under MinGW/Win32
- 619142 Build fixes (GDBus)
-
-* Updated translations:
- Estonian
- Galician
- Norwegian bokmål
-
-Overview of Changes from GLib 2.25.5 to GLib 2.25.6
-===================================================
-
-* GDBus: introspection improvements
-* GDBus: build fixes
-
-* GSettings: GSettingsBackend ABI changed **** NOTE ****
-* GSettings: --uninstall option for schema compiler
-* GSettings: new m4 macro with more power
-* GSettings: thread support
-
-* rework of file notification on Solaris
-* fixes for gold linker
-
-* Bugs fixed:
- 619038 increase gsettings.m4 power
- 619031 method-calls-in-thread test failing
- 618839 Typo at translation message
- 616864 GSETTINGS_CHECK_RULE doesn't work with multiple files
- 618730 gunixcredentialsmessage.c doesn't compile on GNU/kfreebsd
- 616314 Make GSettings (partially) threadsafe
-
-* Updated Translations:
- Indonesian
- Galician
- Spanish
-
-Overview of Changes from GLib 2.25.4 to GLib 2.25.5
-===================================================
-
-* GDBus: Fix serialization of empty arrays
-
-* GDBus: Plug various memory leaks
-
-* GSettings: Fix problems with GSETTINGS_CHECK_RULE
-
-* Bugs fixed:
- 616731 GSETTINGS_CHECK_RULE doesn't work in non-srcdir builds
- 616864 GSETTINGS_CHECK_RULE doesn't work with multiple files
- 618615 mem leaks in parse_value_from_blob
- 618622 Plug some mem leaks in gdbus
- 618650 Plug a mem leak in gdbusauth
- 618663 Plug mem leaks in gdbus tests & examples
-
-* Updated translations:
- Spanish
-
-
-Overview of Changes from GLib 2.25.3 to GLib 2.25.4
-===================================================
-
-* GDBus D-Bus support has been merged. This provides an API
- to replace dbus-glib
-
-* GVariant no requires strings to be UTF-8. You can use byte
- arrays for non-UTF-8 strings.
-
-* GSettings allows to bind string properties to byte arrays
-
-* The schema compiler supports range restrictions
-
-* Bugs fixed:
- 618051 socket-server|client.c fail to compile under AIX...
- 616102 GSettings ignores <choice> and <range>
- 616720 Chunked quark allocation
- 616877 Several issues with g_socket_receive_message
- 616892 gio: Add a boxed type for GFileAttributeMatcher
- 616967 Add g_regex_get_compile_flags() and g_regex_get_match_flags()
- 617767 g_settings_[gs]et_strv() 'length' argument has missing docs...
- 617914 gtester-report: cope with binaries with no test cases
- 617937 output_stream_close vs output_stream_close_async semantics
- 615494 Connction timeouts produce partially invalid error messages
- 617823 glib-compile-schemas problems with an out of source build
- 617947 glib-mkenums: add @valuenum@ support
-
-* Translation updates:
- Galicaian
- Norwegian bokmål
- Shavian
- Spanish
-
-
-Overview of Changes from GLib 2.25.2 to GLib 2.25.3
-===================================================
-
-* New macro: G_GNUC_DEPRECATED_FOR, a variant of G_GNUC_DEPRECATED
- that lets you add replacement information (requires gcc 4.5)
-
-* Rename AM_GSETTINGS autoconf macro to GLIB_GSETTINGS
-
-* Rename gschema-compile utility to glib-compile-schemas
-
-* Add support for timeouts in GSocket
-
-* Bugs fixed:
- 589989 Compilation error on Solaris 9
- 616648 Change AM_GSETTINGS macro to GLIB_GSETTINGS
- 587898 I/O timeouts for GSocket
- 614541 Add G_TYPE_ERROR boxed type for GError
-
-
-Overview of Changes from GLib 2.25.0 to GLib 2.25.2
-===================================================
-
-* Include a 'gsettings' utility, for commandline access to GSettings
-
-* Install a AM_GSETTINGS autoconf macro similar to AM_GCONF
-
-* GSettings can bind the writability of a key explicitly
-
-* There is now a predefined boxed type for GError
-
-* Bugs fixed:
- 615379 g_new macros crash if sizeof(struct_type) == 0
- 616312 Add m4 rule equivalent to GCONF_SCHEMAS_INSTALL
- 616295 mapping bug for uint64
- 616216 glib compile from remote directory fails
- 615960 Fix size passed to connect() for abstract sockets
- 616432 Crash in gschema-compile
- 616331 gsettings-schema-convert uses imaginary types
- 616309 gsettings-schema-convert should output gettext-domain
- 616384 Add mention of GConfBridge in conversion docs
- 616311 gschema-compile outputs in current directory
- 616276 simplify gschema-compile test setup
- 616156 keys with unnecessary empty options arrays
- 616405 gsettings missing g_return_if_fail's
- 616245 Use G_DEFINE_INTERFACE macro
- 614541 Add G_TYPE_ERROR boxed type for GError
-
-* Updated translations:
- Catalan (Valencian)
- Galician
- Kannada
- Spanish
-
-
-Overview of Changes from GLib 2.24.0 to GLib 2.25.0
-===================================================
-
-* The GSettings framework has been merged. This provides the API to
- replace GConf. DConf will provide a backend implementation for it.
- GConf will also provide a backend implementation to ease the
- transition. We provide utilities to assist with schema conversion
- and data migration, as well as a porting guide.
-
-* Translation updates:
- Bengali
- Catalan
- Danish
- Gujarati
- Marathi
- Thai
- Traditional Chinese
-
-
-Overview of Changes from GLib 2.23.6 to GLib 2.24.0
-===================================================
-
-* Bug fixes:
- 613601 buglet in dup_close_on_exec_fd
- 584284 g_data_input_stream_read_until_async behaves confusingly
- 613748 Write errors in middle of copy cause hang
- 613923 splice_stream_with_progress: wrong error handling
- 613667 Typo in GObject documentation
- 613618 gvariant format string docs unclear
-
-* Translation updates:
- Basque
- Ukrainian
- Vietnamese
-
-
-Overview of Changes from GLib 2.23.5 to GLib 2.23.6
-===================================================
-
-* Class private data:
- - support for private data associated with a GTypeClass
-
-* GVariant merge is now complete:
- - loading functions and parser merged
-
-* Windows improvements:
- - socket fixes
- - various build improvements
- - removal of GCC/C99isms in favour of portable code
- - drop unmaintained Visual Studio 8 support
-
-* Minor API addition:
- - g_desktop_app_info_get_filename()
-
-* Bugs fixed:
- 521707 Class private data
- 612502 build fails on glib/tests/gvariant.c
- 612832 [GDesktopAppInfo] New function g_desktop_app_info_get_filename
- 612702 [PATCH] Fix GSocket-related crash on Windows
- 612736 Improve the documentation about single include
- 610858 gvariant test fails sometimes
- 612327 uninitialized variable
-
-* New translations:
- Afrikaans
- LowGerman
-
-* Updated translations:
- Czech
- Finnish
- Galician
- Greek
- Punjabi
- Romanian
- Serbian
-
-
-Overview of Changes from GLib 2.23.4 to GLib 2.23.5
-===================================================
-
-* New API addition: g_malloc_n() and friends used to implement an
- overflow-safe family of g_new() macros.
-
-* GVariant:
- - GVariantBuilder and GVariantIter are now merged.
- - The variable arguments API is now merged.
- - The parser will be in a future release.
-
-* GIO:
- - Remove GUtf8InputStream (which never appeared in a stable release)
- for now since it doesn't satisfy the needs of its main intended use
- case. We hope to reimplement this feature in a better form in a
- future release.
-
-* Bugs fixed:
- 609531 missing licence headers
- 612107 Missing G_FILE_ATTRIBUTE_TRASH_ORIG_PATH
- 611897 g_io_modules_scan_all_in_directory leaks
- 608196 Overflow-safe g_new family
- 611696 gio uses GetAddrInfo which requires special handing on windows 2k
- 605667 Don't use G_PARAM_SPEC_VALUE_TYPE when we know the pspec is valid
- 610860 test_g_file_open_readwrite fails if $HOME is unwritable
- 552912 glib-2.18 /live-g-file/test_copy_move failed when run as root
- 609813 Renaming a file discards file notes
-
-* Updated translations:
- Basque
- Brazilian Portuguese
- British English
- Bulgarian
- Catalan
- Danish
- Estonian
- French
- German
- Hungarian
- Italian
- Lithuanian
- Norwegian bokmål
- Portuguese
- Russian
- Slovenian
- Spanish
- Swedish
- Traditional Chinese
-
-
-Overview of Changes from GLib 2.23.3 to GLib 2.23.4
-===================================================
-
-* GVariant: The core of GVariant has been merged now, with some
- API still to follow.
-
-* GIO:
- - There is a new interface GFileDescriptorBased for file descriptor
- based IO. GLocalFile{Input,Output}Stream implement it
- - Use splice(2) to transfer data between file descriptors without
- extraneous copies
- - Add a way to request move events from file monitors
-
-* Bugs fixed:
- 609143 *result_uncertain is never assigned in g_content_type_guess
- 604086 Use splice(2) when doing local file copies
- 547890 No move events for GFileMonitorEvent?
- 568760 nautilus freezes due to a bug in garray.c:322
- 609962 Add info about the use of G_DEFINE_INTERFACE
- 609564 g_base64_encode_close docs should mention outbuf size...
- 610484 g_variant_equal bug
- 610131 libasyncns does not compile on Solaris 8
- 609530 missing single header include guards
-
-* Updated translations:
- Czech
- Estonian
- Galician
- German
- Korean
- Polish
- Slovenian
- Spanish
- Traditional Chinese
-
-
-Overview of Changes from GLib 2.23.2 to GLib 2.23.3
-===================================================
-
-* GLib now has a facility for locks that consume only one bit of
- storage inside an integer: g_bit_lock()
-
-* GVariant: The serializer has been merged, with more API to follow
-
-* Bugs fixed
- 548967 1 bit mutex lock
- 604967 2.22.3 libasyncns build fails on HP-UX 11.11
- 608602 G_VALUE_COLLECT_INIT variables shadow those in G_VALUE_COLLECT
- 608743 Crash in g_hostname_to_ascii visiting certain website in epiphany
- 599197 array ref and unref functions crash on NULL array.
- 608159 mem leak in g_io_modules_scan_all_in_directory
-
-* Translation updates
- Brazilian Portuguese
- Czech
- French
- Norwegian bokmål
- Slovenian
- Spanish
- Thai
-
-
-Overview of Changes from GLib 2.23.1 to GLib 2.23.2
-===================================================
-
-* We are now using gcc builtins for atomic operations when available
-
-* g_assert() grew the ability to store assertions in core dumps
-
-* GIO supports lazy loading of GIO modules, and there is a new
- gio-querymodule utility that goes along with this.
- Packagers will need to adapt to this.
-
-* Threading changes:
- - The requirements for g_thread_init() have been relaxed slightly,
- it can be called multiple times, and does not have to be the first
- call.
- - GObject now links to GThread and threads are enabled automatically
- when g_type_init() is called.
- - Thread-safety issues with boxed types in GObject have been fixed.
-
-* GObject:
- - Another bunch of performance work has landed
-
-* GVariant:
- - GVariantType has been merged, with the rest of the GVariant
- API to follow.
-
-* Bugs fixed:
- 568760 nautilus freezes due to a bug in garray.c:322
- 602417 Document lifecycles of GSimpleAsyncResult and friends
- 604824 crash in Epiphany: Selecting my Slashdot bo...
- 448888 don't init g_slice for always-malloc
- 531902 Use GCC atomic buildins for g_atomic*
- 554887 boxed type registration is not thread safe
- 586150 unresolved symbols when building glib 2.21.2 on OS X Tiger
- 589176 row gvalue transform array exponentially
- 594872 Support storing assertion messages into core dump
- 602240 Upgrade libasyncns to 0.8
- 603590 Speed up G_VALUE_COLLECT
- 604457 gutf8inputstream.c: increasing unknown size pointer
- 605686 GCharsetConverter doesn't flush
- 605733 g_memory_output_stream_new violates GObject standards
- 605883 g_object_new() processes varargs even when there are none
- 605977 invalid utf-8 conversion in g_local_file_get_parse_name(...
- 606775 Enable threads by default in gobject
-
-* Translation updates:
- Asturian
- Basque
- Bengali
- Bulgarian
- Estonian
- Norwegian bokmål
- Spanish
- Thai
- Ukrainian
-
-
-Overview of Changes from GLib 2.23.0 to GLib 2.23.1
-===================================================
-
-* GObject performance work has landed:
- - Construction of simple objects is much faster
- - Interface lookup is lock-free and constant-time now
- - Reduced locking overhead when dealing with types
-
-* GType now has a G_DEFINE_INTERFACE convenience macro
-
-* GIO gained GUtf8InputStream, an input stream that
- performs utf-8 validation
-
-* GLib now has byte-swap macros for gsize and gssize
-
-* Bugs fixed:
-557151 Determining the newly_constructed boolean in gobject.c...
-557100 Performance improvements for GObjectClasses that don't...
-501166 Warning message says IA__g_type_init instead of g_type_init
-585375 Performance and Contention problems with g_type_class_ref...
-587892 Race in GType when instantiating the same class for the...
-603270 Input Stream validating utf8
-603476 gioenums.h:62: error: comma at end of enumerator list
-603540 g_time_val_from_iso8601 uses uninitialised variable
-603982 Stack overflow when reading file async with filter
-604645 G_DEFINE_INTERFACE_* documentation is not generated
-604875 Use of sa_len conflicts with system header
-320482 provide G_DEFINE_TYPE like macros for interfaces
-
-* Updated translations:
- Estonian
- Hebrew
- Norwegian bokmål
- Vietnamese
- Welsh
-
-
-Overview of Changes from GLib 2.22.x to GLib 2.23.0
-===================================================
-
-* GIO:
- - GConverter: a generic interface for stateful conversions of data,
- suitable for charset conversion, compression, decompression, regexp
- replacement. Concrete implementations are GCharsetConverter,
- GZlibCompressor and GZlibDecompressor. GConverterInputStream,
- GConverterOutputStream are stream implementations that convert data
- while loading or saving it.
- - GMounts can now have a 'default location': a path that reflects
- the main entry point for the user (e.g. the home directory).
- - As a consequence of the compression support, GIO depends on zlib now.
-
-* GObject:
- - G_IMPLEMENT_INTERFACE_DYNAMIC: a convenience macro for adding
- interfaces to dynamic types.
-
-* GModule:
- - The -pthread flag has been added to all gmodule .pc files, because
- it is not generally permissible to load modules that are linked
- against libpthread if the program has not been compiled with threading
- support.
-
-* Bugs fixed:
- 601637 GUnixFDMessage should contain a GUnixFDList
- 585566 GSocketListener API issues
- 572252 Bug in g_file_test() function.
- 600550 g_app_info_create_from_commandline doesn't treat arguments properly
- 541236 not detecting exact content type
- 350200 [PATCH] GTypeModule derived class unref does not unload plugin
- 589631 Please enclose literal values with double quotes
- 577711 cross compile check for g++ broken
- 600620 Support X-GNOME-FullName in GAppInfo
- 598899 GWin32DirectoryMonitor is broken
- 593809 Nautilus does not restore the position of the icons on the desktop...
- 563627 g_get_prgname() threadsafety
- 600141 Add -pthread to gmodule pkg-config
- 593856 file and directory monitors don't work when glib is compiled...
- 324930 Nautilus should disallow copying of symlink to FAT drive early
- 587300 Deadlock when calling g_cancellable_disconnect in a...
- 595138 GFile not robust with invalid input
- 591216 Warning building resolver.o
- 590016 Does not compile under MinGW32 + Wine
- 591214 Warnings building gcancellable.o
- 561998 Have specific entry points (paths) for mounts...
- 508157 Add G_IMPLEMENT_INTERFACE_DYNAMIC
- 535159 g_file_has_parent
-
-* Updated translations:
- Brazilian Portuguese
- Catalan
- Estonian
- Galician
- Norwegian bokmål
- Shavian
- Slovenian
- Spanish
- Swedish
-
-
-Overview of Changes from GLib 2.22.1 to GLib 2.22.2
-===================================================
-
-* GIO:
- - Support case-sensitive globs in the shared mime database,
- including support for the newer cache format that allows these.
- Case-sensitive globs have been introduced in shared-mime-info
- version 0.70
-
-* GObject:
- - Speed up creation of simple objects
-
-* Bugs fixed:
- 597194 Typo in _G_TYPE_CVH macro
-
-* Updated translations:
- Russian
-
-
-Overview of Changes from GLib 2.22.0 to GLib 2.22.1
-===================================================
-
-* Bugs fixed:
- 596064 Test file marked for translation
- 595972 possibly invalid search in mime_info_cache_dir_add_...
- 596561 C99 style of declaration of variable in gmessages.c
- 596314 g_utf16_to_utf8 returns an invalid UTF8 string
- 596748 g_async_result_get_source_object returns a new ref
- 593809 Nautilus does not restore the position of the icons...
- 593775 uses inotify_init1 unconditionally
-
-* Updated translations:
- Bengali
- Hebrew
-
-
-Overview of Changes from GLib 2.21.6 to GLib 2.22.0
-===================================================
-
-* Add gdb python macros to make gobject debugging more pleasant
-
-* Bugs fixed:
- 579050 Allow making selected critical and warning messages non-fatal
- 594759 g_socket_send_message fails due to invalid sendmsg params
- 593941 GNetworkAddress skipping addresses when enumerating
- 594597 Fix build with srcdir != builddir
- 595619 Include gdb pretty printers
-
-* Changes that might affect bindings:
- - The error parameter of g_simple_async_result_set_from_error has been
- made const.
-
-* Updated translations:
- Assamese
- Bengali India
- British English
- Bulgarian
- Catalan
- Czech
- Danish
- Finnish
- Galician
- Greek
- Gujarati
- Hindi
- Japanese
- Kannada
- Malayalam
- Marathi
- Norwegian bokmål
- Oriya
- Polish
- Punjabi
- Romanian
- Serbian
- Simplified Chinese
- Slovenian
- Spanish
- Tamil
- Telugu
- Thai
- Traditional Chinese
- Ukrainian
- Vietnamese
-
-
-Overview of Changes from GLib 2.21.5 to GLib 2.21.6
-===================================================
-
-* Minor API additions:
- g_mkstemp_full is a variant of g_mkstemp that allows to specify flags
- and permissions
-
-* Bugs fixed:
- 593232 g_rand_new: read no more than requested from /dev/urandom
- 591995 use saved errno
- 589491 g_time_val_from_iso8601 doesn't handle some cases
- 593406 Permissions set to 777 after copying via Nautilus
- 594034 Add g_mkstemp_full()
-
-* Updated translations:
- Assamese
- Basque
- Brazilian Portuguese
- Czech
- Estonian
- French
- German
- Hungarian
- Italian
- Kannada
- Malayalam
- Marathi
- Norwegian bokmål
- Oriya
- Portuguese
- Swedish
- Tamil
- Turkish
-
-
-Overview of Changes from GLib 2.21.4 to GLib 2.21.5
-===================================================
-
-* A performance problem with trashing of many files has been fixed
-
-* GResolver now invalidates the libc resolv.conf cache as needed
-
-* Minor api additions:
- - g_cancellable_make_pollfd returns a boolean now. And there is a
- new function g_cancellable_release_fd that can be used to released
- the resources used by a GCancellable.
-
-* Bugs fixed:
- 589988 Compilation error on Solaris 9 (missing stdint.h)
- 588901 gtcpconnection.c won't compile
- 584246 GResolver needs to call res_init() when network state changes
- 591714 Figure out failure handling for g_cancellable_make_pollfd()
- 591532 redundent '/' returned from g_file_resolve_relative_path
- 591378 Use MSG_NOSIGNAL in GSocket if it's available
- 589649 API documentation migration for Base64 Encoding
- 591840 configure fails with autoconf 2.64
-
-* Updated translations:
- Basque
- Brazilian Portuguese
- Bulgarian
- Danish
- Estonian
- Finnish
- Galician
- Gujarati
- Hndi
- Irish
- Japanese
- Korean
- Norwegian bokmål
- Polish
- Portuguese
- Punjabi
- Spanish
- Swedish
- Telugu
- Traditional Chinese
- Thai
-
-
-Overview of Changes from GLib 2.21.3 to GLib 2.21.4
-===================================================
-
-* GTree is now refcounted
-
-* Bugs fixed:
- 587938 Undocumented limitation for g_str_equal
- 587773 refcounts for GTree
-
-* Updated translations:
- French
- Hebrew
- Norwegian bokmål
- Spanish
- Swedish
- Traditional Chinese
- Ukrainian
-
-
-Overview of Changes from GLib 2.21.2 to GLib 2.21.3
-===================================================
-
-* GMappedFile is refcounted now
-
-* Mainloop: It is now possible to set per-thread default contexts,
- with g_main_context_push_thread_default.
-
-* glib-mkenums supports a @basename@ substitution, in addition
- to @filename@.
-
-* GIO:
- - Vfs implementations can support storing of per-file metadata.
- - GCancellable can now be subclassed.
- - Unmount and eject methods now optionally allow interaction, via
- variants that take a GMountOperation object.
-
-* Bugs fixed:
- 556706 Inconsistent help arguments -h, -?
- 579449 FileChoosers no longer work if an idle handler is active
- 579933 mainloop FD_CLOEXEC has a race condition
- 579984 alternate GMainContext support
- 585937 gio/gsocket.c (glib 2.21.2) does not compile (Windows/mingw)
- 586675 Runtime library location
- 586797 Add GCancellables to GSocket ops
- 586868 g_filename_complete_get_completions doesn't always return...
- 587415 g_resolver_lookup_by_name_finish returns a freed list
- 587434 regression tests fail, at least on x86_64
- 586928 Avoid g++ warning in g_error()
-
-* Updated translations:
- Estonian
- Hebrew
-
-
-Overview of Changes from GLib 2.21.1 to GLib 2.21.2
-===================================================
-
-* GIO:
- - g_socket_speaks_ipv4 is a new function to check if a socket can
- speak IPv4.
- - g_socket_listener_add_address gained a new effective_address out
- parameter.
- - GIO now returns special icons for XDG user directories, by the
- name folder-music, folder-documents, etc.
- - GIO gained support for starting/stopping of drives, which can be used
- in connection with external hard disk enclosures, disk arrays, iSCSI
- devices, etc. See g_file_start/stop_mountable.
-
-* GLib:
- - g_reload_user_special_dirs_cache is a new function to force GLib to
- reload the XDG user directory mapping from disk.
-
-* Bug fixes:
- 584574 glib compile failure on Mac OS X with gunixresolver.c and...
- 585566 GSocketListener API issues
- 584255 Incorrect freeing of thread pool in GThreadedSocketService
- 585088 g_string_chunk_insert_len stops at nul bytes
- 585360 Monitor fontconfig configuration files using gio causes m...
- 580103 Terminal starts on Display :0.0 when started on :0.1 in D...
- 580301 network: a few issues on old darwin
- 583398 SRV weight sorting is incorrect
- 584176 build fixes on FreeBSD
- 585189 g_cancellable_reset() must be called in same thread as g_...
- 585280 compilation dies on gio/gsocket.c, needs sys/uio.h to con...
- 585281 gio/gunixfdmessage.c needs sys/types.h for platforms that...
- 585478 don't leak the inotify fd
- 585575 g_socket_listener_add_inet_port() doesn't do the right thing
- 585599 g_socket_listener_add_socket() consumes the socket
- 585676 GEmblem doesn't reference its 'icon' if that is set as a ...
- 585717 "bytes" nautilus translation to french is not shown in th...
- 541276 XDG directories should have their own icons
- 585726 Grammatical error in GList documentation
- 585520 Wrong warning option in documentation
- 585673 GNOME Goal: Remove deprecated glib symbols
- 585591 Starting/stopping drives
-
-* Updated translations:
- Bengali India
- Norwegian bokmål
-
-
-Overview of Changes from GLib 2.21.0 to GLib 2.21.1
-===================================================
-
-* GIO:
- - Support for network IO has been added, including a low-level
- socket API and a high-level API for network connections and
- services.
- - Support for read-write access with GIOStream and its subclasses.
- - GMount gained a pre-unmount signal.
-
-* Bug fixes:
- 576104Implement GMount::pre-unmount
- 578769 implement GWinHttpFileInputStream::close_fn
- 582856 gsocket.c doesn't compile on Solaris
- 569375 g[u]intptr undocumented
- 573246 [FIX] g_desktop_app_info_dup() can access NULL pointer
- 575013 g_cancellable_push_current() does not allow NULL
- 577884 live-g-file.c:461: error: format ‘%d’ expects type ...
- 578499 g_output_stream_splice and stream closing with gnio strea...
- 579558 Application employing gvfs crashes with only libgvfscommo...
- 583001 SIGPIPE (grr!)
- 583061 Please add convenience function to connect to machines by...
- 583198 typo in error message
- 583206 use g_set_error_literal where appropriate
- 583229 void function g_async_initable_init_async returns value
- 583324 locking problem in g_main_context_iterate()
- 583408 void function g_socket_control_message_serialize returns ...
- 578786 wrong and confusing error message
- 583205 g_inet_address_to_bytes has no length outparam
- 583196 mem leak in keyfile test
- 583663 GSocketType enum ends with a comma
- 569024 Make g_error_new_valist public
- 569376 missing G_G[U]INTPTR_FORMAT
- 580347 off-by-1 bug in GWinHttpFile
-
-* Updated translations:
- Oriya
- Spanish
- Valencian-Catalan
-
-
-Overview of Changes from GLib 2.20.x to GLib 2.21.0
-===================================================
-
-* GIO:
- - New helper functions g_cancellable_connect/disconnect to avoid
- race conditions when connecting to the "cancelled" signal on
- GCancellable.
- - New types and methods for dealing with IPv4 and IPv6 addresses (and
- UNIX domain socket addresses under UNIX). This does not include code
- for actual socket I/O.
- - GResolver provides asynchronous and cancellable APIs for resolving
- hostnames, reverse lookup of IP addresses and resolving SRV records.
-
-* Glib now provides hash and comparison functions for int64 and double
- types, suitable for use with GHashTable.
-
-* GArray, GPtrArray and GByteArray can be ref counted now, and have
- boxed types.
-
-* Bugs fixed:
- 572844 Helper for GCancellable::cancelled connect/disconnect
- 578363 goption docs should be improved
- 548466 async/cancellable DNS resolver
- 579830 param spec strings should use P_()
- 579862 requesting xattr::foo ends up calling getxattr(..., user...
- 580453 Hash and equal functions for gint64 and gdouble
- 580450 Reference counting and boxed types for arrays
- 580194 gresolver doesn't build on Solaris
- 580301 network: a few issues on old darwin
- 580299 network: include sys/types.h before sys/socket.h to insur...
- 572508 gmarkup speedup
- 580546 g_strtoull() referenced in documentation...
- 580656 g_key_file_set_string_list erroneously asserts list != NULL
- 579272 leaks in g_simple_async_result_set_op_res_gpointer
-
-
-* Updated translations:
- Catalan (ca)
- Pashto (ps)
- Spanish (es)
-
-
-Overview of Changes from GLib 2.20.0 to GLib 2.20.1
-===================================================
-
-* Bug fixes:
- 575555 Use fsync() when replacing files to avoid data loss on
- 575708 runaway inotify madness
- 575270 GVolumeMonitor::mount-pre-unmount not being emitted
- 577128 glib make check Failed to execute child process...
- 573673 Always show "backup" directories
- 578369 g_time_val_from_iso8601() parses timezones incorrectly
- 578002 Fix a small typo in GFile docs
- 578017 G_DEFINE_TYPE_EXTENDED docs
-
-* Updated translations:
- Arabic
- Assamese
- Basque
- Bularian
- Brazilian Portuguese
- British English
- Catalan
- Danish
- French
- Galician
- German
- Greek
- Hungarian
- Italian
- Japanese
- Kannada
- Lithuanian
- Malayalam
- Norwegian bokmål
- Oriya
- Polish
- Punjabi
- Russian
- Simplified Chinese
- Slovenian
- Spanish
- Swedish
- Tamil
-
-
-Overview of Changes from GLib 2.19.9 to GLib 2.20.0
-===================================================
-
-* Base64 support: Avoid integer overflows. CVE-2008-4316
-
-* Bugs fixed:
- 574019 GChecksum: document and guarantee hex characters in lower case
- 573454 Unable copy/move files to directories symlinked to gvfs share
- 561172 gnome-open fails on local URIs with anchors
- 573970 crash in gunixvolumemonitor:update_mounts when unmounting
- 573843 g_get_current_dir returns non-absolute path
-
-* Updated translations:
- Assamese (as)
- Bengali (bn_IN)
- Czech (cs)
- Hindi (hi)
- Italian (it)
- Japanese (ja)
- Lithuanian (lt)
- Malayalam (ml)
- Marathi (mr)
- Oriya (or)
- Polish (pl)
- Romanian (ro)
- Telugu (te)
-
-
-Overview of Changes from GLib 2.19.8 to GLib 2.19.9
-===================================================
-
-* GMarkup:
- - Considerable speedup
-
-* GIO
- - Add G_FILE_CREATE_REPLACE_DESTINATION flag to allow replacing
- the destination of a copying operation as if it did not exit before.
- - Be more careful when classifying files as desktop files
- - Support desktop file key X-GIO-NoFuse which disables the use
- of fuse pathnames for %u and %U arguments
-
-* Bugs fixed:
- 572672 glib/gthread.c: argument is different type
- 572464 Doc for g_file_get_contents
- 572151 “it's” and “its” confused in docs and comments
- 570501 g_win32_get_system_data_dirs uses invalid conversion...
- 167569 g_string_append_printf crashes on win32 when used...
- 572508 gmarkup speedup
- 560564 Replacing a symlink with its linked file truncates...
- 549298 impossible to copy files with p (pipe) flag
- 543183 Clarify docs for g_file_has_prefix
- 540461 g_memory_output_stream_get_data_size() doesn't behave...
- 573462 GEmblemedIcon leak
- 573421 Clarify message format in GMountOperation
- 573658 Deadlock in giomodule.c
- 556706 Inconsistent help arguments -h, -?
- 573527 Wrong shell to run config.status in Makefile.in.in
- 573128 A couple of typos in GObject documentation
-
-* Updated translations:
- Catalan (ca)
- British English (en_GB)
- Spanish (es)
- Basque (eu)
- Finnish (fi)
- French (fr)
- Gujarati (gu)
- Hebrew (he)
- Hungarian (hu)
- Korean (ko)
- Maithili (mai)
- Norwegian bokmål (nb)
- Dutch (nl)
- Portugese (pt)
- Swedish (sv)
- Thai (th)
- Traditional Chinese (zh_HK)
- Traditional Chinese (zh_TW)
-
-
-Overview of Changes from GLib 2.19.7 to GLib 2.19.8
-===================================================
-
-* GIO: Fix missing exports of new API
-
-* Fix strict aliasing warnings and violations to make Glib work
- with gcc 4.4
-
-
-Overview of Changes from GLib 2.19.6 to GLib 2.19.7
-===================================================
-
-* GIO
- - GFile gained an attribute for the actual file size in bytes
- - GMountOperation gained an "aborted' signal that allows to abort
- a mount operation from the backend side
-
-* Bugs fixed:
- 523742 Use noinst for non-installable libraries
- 566747 URIs opened with firefox %u load as local files
- 541225 Can't compile gio on AIX duplicate case value in gioerror.c
- 571598 GAsyncResult with NULL gobject
- 505042 add file attribute for actually used file size in bytes
-
-* Updates translations:
- Basque (eu)
- Gujarati (gu)
- Italian (it)
- Japanese (ja)
- Norwegian bokmål (nb)
- Dutch (nl)
- Portugese (pt)
- Thai (th)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.19.5 to GLib 2.19.6
-===================================================
-
-* New format macro to print goffset data: G_OFFSET_FORMAT
-
-* GIO:
- - Add a GFilter{Input,Output}Stream::close-base-stream properties which
- determine whether the base stream will be closed when the filter stream
- is finalized.
- - g_data_input_stream_read_line and ..._read_until have asynchronous
- variants now.
-
-* Bugs fixed:
- 568294 A wrong reference in the description of g_bookmark_file_...
- 563141 RFE: define G_OFFSET_FORMAT
- 569105 g_time_val_to_iso8601() assumes time_t==long
- 568394 dropping the last reference to a stream filter closes...
- 568741 g_buffered_input_stream_fill_async doesn't work
- 568723 g_buffered_input_stream_fill_async doesn't take count == -1
- 568575 _async functions for GDataInputStream
-
-* Updated translations:
- Bulgarian (bg)
- Finnish (fi)
- Hungarian (hu)
- Oriya (or)
- Swedish (sv)
- Traditional Chinese (zh_HK)
- Traditional Chinese (zy_TW)
-
-
-Overview of Changes from GLib 2.19.4 to GLib 2.19.5
-===================================================
-
-* Update included PCRE to 7.8
-
-* g_base64_decode_inplace: New function to do base64 decoding in place
-
-* Bugs fixed:
- 567138 get_package_directory_from_module() does not free ...
- 566569 gregex docs clarification
- 566573 g_match_info_fetch_pos docs
- 564728 Add function to decode base64 encoded data in place
- 567838 G_STRUCT_OFFSETOF fails to compile under icc 9.1
- 567977 textdomain() macro should not return NULL ...
- 512779 --disable-regex breaks compilation
- 566770 error code 0 for Too many open files is useless
- 565484 g_content_type_guess passes non-UTF8 text to XDG ...
-
-* Updated translations:
- Catalan (ca)
- Spanish (es)
- Italian (it)
- Swedish (sv)
-
-
-Overview of Changes from GLib 2.19.3 to GLib 2.19.4
-===================================================
-
-* GIO:
- - Use O_NOATIME when sniffing mimetypes
- - Add a convenience method to check if a GSimpleAsyncResult
- is valid
-
-* Bugs fixed:
- 560676 function access for g_threads_supported
- 565905 There is no g_context_group_set_translation_domain
- 564210 SUN Studio 12 has supported visibility attribute
- 565136 GObject's "notify" signal parameters are wrong in gtk-doc
- 565831 error in interface creation sample
- 566348 g_file_open_tmp uses the wrong g_mkstemp on win32
- 566064 Add NOATIME flag to query_info_flags
- 566170 g_async_result_verify_source_object
-
-* Updated translations:
- Spanish (es)
- Norwegian bokmål (nb)
- Brazilian Portugese (pt_BR)
- Simplified Chinese (zh_CN)
-
-
-Overview of Changes from GLib 2.19.1 to GLib 2.19.3
-===================================================
-
-* Bugs fixed:
- 508021 Add support for the CRIS and CRISv32 architectures
- 526320 should not list mounts that the user doesn't have permission to use
- 558458 Cannot build gio tests on Solaris using SUN cc
- 555465 GUnix{Input,Output}Stream lacks fd/close_fd_at_close property
- 558298 Hide ecryptfs mounts
- 515777 incorrect date&time on copy
- 562452 Ensure we return G_IO_ERROR_CANCELLED if cancelling
- g_simple_async_result_run_in_thread
- 473150 g_type_module_use inconsistently increases the use
- counter in case of error
- 563150 G_GU?INT*_MODIFIER/FORMAT docs
- 563156 Document printing and scanning gunichar values
-
-* Updated translations:
- Hebrew (he)
- Italian (it)
-
-
-Overview of Changes from GLib 2.19.0 to GLib 2.19.1
-===================================================
-
-* GIO:
- - g_icon_to_string, g_icon_new_for_string: GIcon serialization support
- - G_FILE_ATTRIBUTE_PREVIEW_ICON: new file attribute for preview images
- - g_app_info_get_commandline: new function to get the full commandline
- - g_mount_shadow, g_mount_unshadow, g_mount_is_shadowed: New functions
- to 'shadow' mounts (i.e. hide them from the UI when they already
- have a different representation, like a bookmark)
-
-* Bugs fixed:
- 556186 gpoll.h breaks gmain.h inclusion
- 557087 mem leak in g_content_types_get_registered
- 556921 gpoll.h breaks hal compilation
- 557210 g_compute_checksum_for_* asserts with less than 2 bytes
- 558381 Add support for compile time assertions
- 558185 'parent' variable in g_local_file_get_child_for_display_name()
- hits g_object_unref(NULL) assertion
- 558513 g_warn_if_fail FIXME in gtestutils
- 558672 NULL key lookup using g_hash_table_lookup_extended()
- 555740 gicon serialization
- 557182 preview functionality
- 528320 Incorrect icons displayed for files with custom mimetype icons
- 556910 Memory leak: sub
- 557592 Missing include in gwinhttpfile.c
- 556415 Crash on Windows 2000 in g_winhttp_vfs_init()
- 555935 Clarify the mechanism of overwriting properties
- 552776 ac_cv_func_posix_getgrgid_r not mentioned
- 559448 GObject Reference Manual (typo)
- 561212 GFileReadMoreCallback API doc refers to non-existant function
- 560569 gkeyfile doesn't use the set list_separator in some cases
- 560568 gkeyfile docs buglet
- 559413 g_option_group_set_error_hook docs buglet
- 562378 callback return value not respected for callback option
- with no arg
- 559110 Do not include libintl.h after glibintl.h
- 557603 carbon check output misplaced
- 562544 g_key_file_get_string and g_key_file_get_value
- documentation does not explain the difference
- 547264 Missing "no flags" flag
- 562638 GDebugKey key member should be const
- 562639 g_parse_debug_flags() parsing "help"
- 562549 g_byte_array_free should tell how free data
- 559452 GObject Reference Manual (typo)
- 559462 GObject Reference Manual (typo)
- 559517 GObject Reference Manual (typo)
- 562538 GObject interface tutorial shouldn't finalise with
- "Please forget everything"
- 561352 Leak of icon description
- 561375 Leaks mountpoint description
- 561807 inotify_sub.c: dup_dirname() fails to remove trailing '/'
- 562393 g_buffered_input_stream_read_byte broken if data available
- 541715 win32 : patch for warnings and signature problems in recent code
- 547481 g_data_input_stream_read_line behaves not as stated in the docs
- 548163 Nautilus displays wrong error message for too long file names
- 559633 gtk_image_new_from_gicon does not always work for .desktop files
- 555486 – No way to recover command line from GAppInfo
-
-* Translation updates:
- Spanish (es)
- Ukrainian (uk)
-
-
-Overview of Changes from GLib 2.18.1 to GLib 2.19.0
-===================================================
-
-* Rewrite GHashTable to use open addressing with quadratic probing instead
- of chaining. This has the potential to reduce memory fragmentation
- significantly, while being slightly faster due to better locality and
- no need to call alloc/free functions for nodes. Benchmarks suggest it
- also uses less memory overall.
-
-* Make g_poll available as public api
-
-* New macros g_assert_error and g_assert_no_error to assert
- that a GError is set or unset
-
-* g_cancellable_make_pollfd: New method to make a GPollFD for a cancellable
-
-* g_app_info_can_delete, g_app_info_delete, g_app_info_reset_type_associations:
- New functions to clean up app infos and content types
-
-* When launching applications, always pass fuse file:// uris when possible,
- and let gio convert such uris back to gio uris.
-
-* Bugs fixed:
- 505361 gunixinputstream.c assumes poll() available
- 509446 portable blocking gio cancellation
- 553820 gpoll.c: undeclared identifier
- 553724 python interpretter path not patched in correctly
- 553857 gbacktrace.h requires signal.h
- 553447 g_assert_no_error()
- 554092 glib doesn't return G_FILE_ERROR_NOENT et al on OS X
- 528670 Always pass file:/// uri's in GAppLaunchContext
- 555224 Improve g_format_size_for_display doc
- 555309 giochannel breaks on error
- 554790 g_convert() misbehaves with winiconv versions
- 555314 mem leak in gmarkup
- 555313 GFileAttribute boxed type get_type function should...
- 552861 glib-2.0.m4 calls system(3) without storing its result
- 554557 Patch to fix gcc warnings about missing format specifiers
- 552107 Small libtool fixes
- 551355 Make glib build with libtool 2.2
- 555311 format not a string literal and no format arguments
- 556101 static mutex yields warnings with g++
- 556186 gpoll.h breaks gmain.h inclusion
- 526456 Open addressing in GHashTable
- 553426 cancellable clarifications
- 545350 GAppInfo deletion
- 545351 Reset associations for content type
- 552168 volume's mount not mounted after g_volume_mount_finish
- 554970 segfault when update-desktop-database is not available...
- 554745 GFileAttributeInfoList should be boxed
- 555121 Improved build-time handling of gio module-dir
- 555711 Wrong fallback order of mimetype icons
- 555331 Deprecate adoption of mounts
- 556335 make check fails in abicheck.sh
- 556334 Warning when building without selinux support
- 556422 g_file_enumerator_next_file: unclear...
-
-* Updated translations:
- Arabic (ar)
- Danish (da)
- Polish (pl)
- Brazilian Portugese (pt_BR)
- Romanian (ro)
- Russian (ru)
-
-
-Overview of Changes from GLib 2.18.0 to GLib 2.18.1
-===================================================
-
-* Bugs fixed:
- 550433 g_test_init doesn't recognize --help
- 523463 Core dump in gmain.c:2482:IA__g_main_context_check
- 551228 G_STRFUNC on recent Sun compiler should be expanded...
- 551410 gtestutils.c: using printf without prototype
- 551731 g_date_set_time[_t] docs should mention what timezone
- 548321 <string.h> is not included in gi18n-lib.h
- 551149 xdgmime mem leak
- 550647 synchronous pipe I/O when reading mount reply
- 551887 Docs for g_desktop_app_info_new_from_filename aren't...
- 551681 g_content_type_guess() too naive with filenames
- 552352 g_app_info_launch doesn't work if "Path" key...
- 551408 gmodule.def generated to builddir...
- 552359 g_file_info_get_icon should return GThemedIcon, and...
-
-* Updated translations:
- Arabic (ar)
- Bengali India (bn_IN)
- British English (en_GB)
- Hindi (hi)
- Croatian (hr)
- Korean (ko)
- Oriya (or)
- Turkish (tr)
- Telugu (te)
-
-
-Overview of Changes from GLib 2.17.7 to GLib 2.18.0
-===================================================
-
-* Win32:
- - rework the g_poll() implementation to match poll() semantics more closely
-
-* Bugs fixed:
- 324234 Using g_io_add_watch_full() to wait for connect() to return...
- 548278 Async GETs connections are always terminated unexpectedly...
- 500246 Bug fixes for giowin32
- 523939 Example program for GValue
- 550096 GBookmarkFile parser is not forward compatible
- 550040 Move GString, rand and printf tests to the unit test framework
- 550104 trivial documentation fix for g_get_home_dir
- 548988 g_file_replace fails on Windows when the target file exists
- 550059 Wrong docs for g_emblemed_icon_add_emblem
- 548800 Missing a g_object_get_type function
- 550056 Missing documentation for g_emblemed_icon_get_emblems
-
-* Updated translations:
- Bulgarian (bg)
- Czech (cs)
- German (de)
- Estonian (et)
- Basque (eu)
- French (fr)
- Hebrew (he)
- Hungarian (hu)
- Italian (it)
- Japanese (ja)
- Lithuanian (lt)
- Maithili (mai)
- Dutch (nl)
- Swedish (sv)
- Thai (th)
- Ukrainian (uk)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.17.6 to GLib 2.17.7
-===================================================
-
-* More fixes for 64-bit Windows
-
-* GIO
- - Add a vfs implementation for HTTP and HTTPS URIs on Windows
-
-* Bugs fixed:
- 546329 API docs for g_utf8_normalize() are incorrect
- 546876 Modify GMarkup parser to accept &#x1; .. &#x1f;
- 547200 g_utf8_find_next_char() issues
- 547637 unconditional #include of sys/statfs.h in configure
- 547337 G_DISABLE_DEPRECATED breaks tests build
- 547832 gtk+-2.12.11 fails to build - AC_PROG_MMAP too strict
- 502498 Test framework assertion failures should follow gcc
- 546371 Improve docs re g_file_monitor
- 546483 GThemedIcon:use-default-fallbacks is not readable without...
- 546132 GFileIcon is bindings-unfriendly
- 542156 zfs mount in home directory shown on nautilus desktop
- 535124 umask 002 not being applied for new directories...
- 547080 g_file_copy leaks expected errors
- 546582 Callbacks from GFileMonitor present a GFile...
- 547262 Missing link in the docs
-
-* Updated translations:
- Arabic (ar)
- Catalan (ca)
- Spanish (es)
- Basque (eu)
- Finnish (fi)
- Galician (gl)
- Hebrew (he)
- Marathi (mr)
- Norwegian bokmål (nb)
- Portugese (pt)
- Brazilian Portugese (pt_BR)
- Swedish (sv)
- Thai (th)
-
-
-Overview of Changes from GLib 2.17.4 to GLib 2.17.6
-===================================================
-
-* Fix problems on 64-bit Windows
-
-* g_markup_context_get_user_data: New function to access
- the user_data outside of callbacks
-
-* GIO
- - g_mount_guess_content_type_sync: synchronous version of
- g_mount_guess_content_type
- - GEmblem: A GIcon implementation that adds emblem-related
- metadata to icons
- - GEmblemedIcon: A GIcon implementation that can add emblems
- to icons
-
-* Bugs fixed:
- 544088 option_test_LDADD is left in tests/Makefile.am
- 544465 gmarkup makes it hard to use pre-rolled parsers
- 545485 Implicit declaration of utime()
- 545798 "Since: 2.18" mark is missing in g_set_error_literal...
- 544140 fam-helper 64-bit issue
- 529694 SELinux context setting support
- 545157 wrong/no list of "open with" applications for .cc...
- 545203 gfile.c: argument is different type
- 545457 gdmsetup crashed with SIGSEGV in g_unix_mount_guess...
- 544177 Fix trivial cut and paste error in documentation
- 545395 Language tweak for g_value_set_string* docs
- 541036 Gnumeric crashes when trying to open Desktop...
- 546079 leak in xdgmime
- 545395 Language tweak for g_value_set_string* docs
- 546017 Don't copy attributes when copying a symlink
-
-* Updated translations:
- Arabic (ar)
- Estonian (et)
- Galician (gl)
- Italian (it)
- Japanese (ja)
- Korean (ko)
- Norwegian bokmål (nb)
- Pashto (ps)
- Portugese (pt)
-
-
-Overview of Changes from GLib 2.17.3 to GLib 2.17.4
-===================================================
-
-* GIO:
- - New API to handle content types: g_mount_guess_content_type,
- g_content_type_guess_for_tree.
- - Export the eject-button signal on the volume monitor class
- - New API to enable out-of-process volume monitors:
- g_volume_get_activation_root
-
-* GObject:
- - New API to handle signals without slots in the class structure:
- g_signal_new_class_handler, g_signal_override_class_handler
-
-* Internationalization:
- - Add an NC_ macro that is a no-op equivalent of C_
-
-* GMarkup:
- - Add two new functions g_markup_parse_context_push,
- g_markup_parse_context_pop to support "subparsers"
-
-* Bugs fixed:
- 541208 Functions to easily install and use signals without...
- 541507 Ambiguous description of assigned characters in the...
- 543040 async reading on dummy file will crash on GIO_USE_VFS=local
- 543560 enable gio-FEN back-end warnings on Solaris will crash...
- 528317 GRegex does not allow recursion limit
- 337518 GMarkup: Subparser support
- 541794 drive-eject-button signal
- 541793 activation root for volumes
- 467707 test_iconv_state() in tests/convert-test.c fails on AIX 5.3
- 428048 2 of 51 tests fail on Solaris
- 542332 small fix for error message in GMarkup
- 482413 get_contents_stdio -- overflow and memory corruption
- 406120 g_ascii_strtod
- 334234 "printf" format error
- 536996 Missing noop i18n macro equivalent to C_
- 540616 mem leak in filechooser button
- 539229 gobject-query calls itself query
- 521589 [RFC] gobject documentation should mention Vala
- 543168 Description of G_SLICE=debug-blocks discourages its use
- 543220 Case collision on gio-extension-points.html
- 530759 update the gobject tutorial to the XXI century
- 535223 gbookmark file inefficiency ...
- 543504 crash in Epiphany Web Browser: Opening local file
-
-* Updated translation:
- German (de)
- Estonian (et)
- Pashto (ps)
- Albanian (sq)
- Thai (th)
- Traditional Chinese (zh_HK)
- Traditional Chinese (zh_TW)
-
-
-Overview of Changes from GLib 2.17.1 to GLib 2.17.3
-===================================================
-
-* PCRE
- - fix for CVE-2008-2371
-
-* Bugs fixed:
- 538119 glib's mainloop leaks a pipe to sub-processes
- 537635 Corrections and improvements to g_time_val_{to,from}_iso8601
- 539067 The document g_io_channel_win32_new_fd() says...
- 535949 annotate g_strip_context and g_dpgettext with G_GNUC_FORMAT
- 539123 annotate g_d[n]gettext with G_GNUC_FORMAT
- 539074 Cannot get exit status with g_spawn_command_line_sync
- 316221 G_LOCK warns about breaking strict-aliasing rules
- 539770 migrate gstrfunc unit tests to gtest
- 539626 Update docstrings for g_object_freeze_notify and g_object_thaw_notify
- 538044 unconditional use of LC_MESSAGES
- 540545 Monotonic time and timer offset
- 535947 want g_set_error_literal
- 539999 glibconfig.h: add GLIB_USING_SYSTEM_PRINTF
- 536252 GFileEnumerator should allow access to the containing GFile
- 538362 Get Win32 icons back in the file chooser
- 540802 g_list_prepend doesn't concat lists
- 540423 unrecoverable error after g_seekable_truncate
- 538836 make check failure on PPC and ALPHA: pltcheck.sh on g_atomic_pointer_get
- 539090 g_content_type_from_mime_type() should unalias
- 540331 g_file_append_to () documentation: can return NULL
- 534639 add g_desktop_app_info_new_from_keyfile
- 536733 gio build failure on Irix
- 536160 Add g_file_monitor()
- 538127 FileChooser broken on win32
- 531476 /live-g-file/test_traverse_structure test fails on Mac HFS+
- 538564 gio should have gio-types.h
- 540047 glib-genmarshal.c: '#include <io.h>' is too before
-
-Updated translations:
- Korean (ko)
- Occitan (oc)
-
-
-Overview of Changes from GLib 2.17.0 to GLib 2.17.1
-===================================================
-
-* New function: g_utime(), a gstdio wrapper for utime()
-
-* New functions: g_dgettext() and g_dngettext(), wrappers
- for corresponding gettext functions with added functionaliy
-
-* Support the latest version of the shared-mime spec, including
- icons for mime types
-
-* New function: g_themed_icon_prepend_name()
-
-* Bugs fixed:
- 535418 Please document which glib version defines goffset
- 528715 Misprint in the description of the interface g_type_class_add_private
- 528714 Misprint in the description of the interface g_param_spec_flags
- 537260 Doc bug in G_TYPE_INSTANCE_GET_CLASS()
- 530527 Misprint in the description of the interface
- g_cclosure_marshal_VOID__FLAGS
- 530526 Misprint in the description of the fields 'class_init' and
- 'class_finalize' of the structure GTypeInfo
- 528719 Improvement to the documentation of the "g_object_connect" interface
- 528172 gtk_signal_handlers_unblock_* functions return value
- amount of matched signals, not amount of actually unblocked
- 528717 Misprint in the description of the parameter 'type_id' for
- the interface g_type_register_fundamental
- 528716 Misprint in the description of the parameter 'iface_data' for
- the callback types GInterfaceInitFunc and GInterfaceFinalizeFunc
- 537555 GObject instantiation not thread safe
- 537546 'desktop' shortcut in file chooser looks like a generic folder
- 537392 Additional colon in xattr name
- 536641 Filesystem querying in gio does not list AFS and autofs file systems
- 528600 g_dummy_file_get_parent("scheme://example.com/")
- 503071 Application direction changes to right to left even if theres no
- translation
- 502511 g_assert_cmphex prints invalid message
- 338162 Use po/LINGUAS
- 314453 Nautilus crashes in Solaris when browsing the attached file
- 529321 make check fails in glib/pcre
- 455215 g_get_user_special_dir: no reference about G_USER_DIRECTORY_DOWNLOAD
- fallback to $HOME/Desktop if xdg-user-dirs is not in use
- 498732 g_key_file_to_data cannot fail
- 511367 add g_file_make_directory_with_parents
- 531900 Use __builtin_offsetof for G_STRUCT_OFFSET if building with
- gcc 4.0 or newer
- 536158 also bump GHashTable version when a node is removed via
- g_hash_table_iter_remove()/g_hash_table_iter_steal()
- 531403 g_utf8_collate broken on Mac
- 535628 test/patterntest.c still includes gpattern.h directly
- 535625 alias.h:2648: error: 'utime' undeclared here (not in a function)
-
-* Translation updates:
- Arabic (ar)
- German (de)
- Italian (it)
- Norwegian bokmål (nb)
- Thai (th)
-
-
-Overview of Changes from GLib 2.16.x to GLib 2.17.0
-===================================================
-
-* Update to Unicode 5.1
-
-* Update included libcharset to the one shipped with libiconv 0.12
-
-* Update included PCRE to 7.7
-
-* Enforce that only toplevel headers are directly included.
- This is turned on by default for GObject and GIO. To turn
- it on for GLib, define G_DISABLE_SINGLE_INCLUDES.
-
-* Fix library version of GIO. GLib 2.16 shipped with libgio-2.0.so.0.0.0
-
-* On Solaris, use FEN for file monitoring in GIO
-
-* Use the GIO_EXTRA_MODULES environment variable to find
- additional GIO modules
-
-* G_GNUC_ALLOC_SIZE: New macro that wraps the gcc alloc_size
- function attribute
-
-* g_checksum_reset: New function to reset the state of a GChecksum
-
-* g_unix_mount_monitor_set_rate_limit: New function to limit the
- rate at which events are reported
-
-* g_file_query_file_type: New utility function to query the type of
- a file
-
-* g_memory_output_stream_get_data_size: New function to obtain the
- size of the written data.
-
-* Bugs fixed:
- 522292 Gives warnings in glib/gutils.h with GCC in C99 mode
- 523298 win_iconv can't convert from UTF-8 to GB18030 (or vice versa)
- 518160 replace two g_strdup_printf calls in GBookmarkFile
- 523877 gbookmarkfile: avoid using g_string_append_printf() and
- other optimizations
- 525192 100% CPU if run main loop with no IO sources
- 315437 extern inline -> static inline
- 524314 g_convert() on Win32 implicitly converts full width
- alphanumerics into half width
- 525732 Error in documentation for g_list_first
- 525674 A typo in gmarkup.c
- 448943 g_timeout_add_seconds() problems
- 525972 UCS-4 not in the new win_iconv implementation
- 526619 make test-report crash
- 491554 Update to Unicode 5.1.0
- 519137 g_slice_dup macro needs cast for 64-bit platform
- 528752 Win32 build and SSL not working
- 530457 G_USER_DIRECTORY_DOWNLOAD folder improperly mapped
- 528667 Typos in testing module documentation
- 459905 Bug in wcwidth data
- 534085 g_unichar_iswide_cjk() has a totally wrong table
- 501651 Update glib/libcharset
- 519026 G_STMT_START/G_STMT_END test a non-existent preprocessor symbol
- 534319 GLib's .pc files could use Libs.private
- 534137 Typo in g_spawn_async_with_pipes doc
- 517419 gio win32 directory monitor
- 526796 Wrong order of arguments in g_file_copy's fallback
- 530196 _g_local_file_has_trash_dir() doesn't handle st_dev == 0
- 532965 Should not return filesystem::free for certain file systems
- 525553 fix typo and nitpicking in GArray documentation
- 526572 Missing * in declaration of parent_class in Object
- Destruction section of GObject Reference Manual
- 528648 Extra >s in Object Construction section
- 535021 g_param_spec_internal documentation should
- describe purpose of nick and blurb
- 521513 Firefox crash when using file picker
- 528433 gdesktopappinfo snafu ...
- 533369 API g_file_info_get_attribute_string () unables to get "...
- 521045 glib f_fstypename miscellany
- 521672 compile error
- 521946 control rate limit on GUnixMountMonitor
- 522335 Fails to build: glib/gtester.c:276: error: 'ARG_MAX' unde...
- 523015 Implement sliding window based upload operation
- 523019 Use new GCC 4 feature
- 523338 list nfs4 as a nfs mount type
- 524350 Make glib build without NLS again
- 524579 g_file_copy reports wrong total on progress callback for ...
- 524742 A typo in gtestutils.c.
- 524950 Minor documentation typos.
- 525866 the user directory should not be considered as a mount to...
- 526320 should not list mounts that the user doesn't have permiss...
- 527132 nautilus crash when making ftp connection
- 532852 CRITICAL **: totem_pl_parser_parse_with_base: assertion `...
- 534759 Build failure in gio
- 534764 Typo in error produced by g_file_make_directory
- 521851 Redudant tests in gunixmounts.c
- 524344 glib/gthread.h still use G_GNUC_PRETTY_FUNCTION
- 525060 glib fails to build with -DG_DISABLE_ASSERT in CPPFLAGS o...
- 534177 Invalid description of the interface g_cclosure_marshal_S...
- 520715 Add GFile method g_file_query_file_type
- 523039 nautilus can't access to trash/computer/network if gvfs i...
-
-* Updated translations:
- Arabic (ar)
- Bulgarian (bg)
- Catalan (ca)
- Czech (cs)
- Greek (el)
- Candian English (en_CA)
- British English (en_GB)
- Spanish (es)
- Estonian (et)
- Basque (eu)
- Galician (gl)
- Hebrew (he)
- Hungarian (hu)
- Japanese (ja)
- Lithuanian (lt)
- Norwegian bokmål (nb)
- Dutch (nl)
- Occitan (oc)
- Portugese (pt)
- Russian (ru)
- Slovak (sk)
- Albanian (sq)
- Swedish (sv)
- Turkish (tr)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.16.0 to GLib 2.16.1
-===================================================
-
-* Fix a crash in g_themed_icon_new
-
-* Update the included PCRE to 7.6
-
-
-Overview of Changes from GLib 2.15.6 to GLib 2.16.0
-===================================================
-
-* Fix the definition of G_INLINE_FUNC to work with gcc 4.3.0
-
-* GIO:
- - Add missing GMountMountFlags argument to g_unix_volume_mount
- - Fix the adopt_orphan_mount vfunc to take a volume monitor
- reference
- - Add properties to GThemedIcon for bindings sake
-
-* Bugs fixed:
- 520484 gvfsd-trash crashed with SIGSEGV in g_path_is_absolute()
- 510855 g_checksum_update(): Take -1 for length.
- 517676 g_themed_icon_new*() do more than call g_object_new().
- 518816 should handle rmdir returning EEXIST correctly
- 519352 g_[s]list_delete_link() docs
- 519489 Fixes for sparse warnings in gio
- 520169 add monitor argument to vfunc for GVolumeMonitor
- 520700 Add type check in g_file_query_exists
- 521145 FILE_READ_ONLY_VOLUME not present on Mingw32
- 518720 No MIME type for empty files
- 521013 in documentation, goffset doesn't say "Since 2.x"
- 521028 Missleading error messages from g_io_channel_set_encoding()
- 517484 GMainLoop could set the thread "Alertable" for APCs to be...
-
-* Updated translations:
- Assamese (as)
- Bengali India (bn_IN)
- Czech (cs)
- German (de)
- Spanish (es)
- Estonian (et)
- Finnish (fi)
- French (fr)
- Gujarati (gu)
- Italian (it)
- Lithuanian (lt)
- Malayalam (ml)
- Marathi (mr)
- Norwegian bokmål (nb)
- Romanian (ro)
- Russian (ru)
- Slovak (sk)
- Ukrainian (uk)
-
-
-Overview of Changes from GLib 2.15.5 to GLib 2.15.6
-===================================================
-
-* GIO:
- - New file attributes: trash::item-count, filesystem::use-preview
- - Rename g_file_contains_file to g_file_has_prefix
- - g_file_query_filesystem_info grew async variants
- - g_themed_icon_append_name: new convenience function
- - g_content_type_get_icon is implemented now
- - Only show mounts in /media and ~
- - g_file_contains_file has been renamed to g_file_has_prefix
-
-* Win32:
- - g_win32_get_package_installation_directory_of_module: new function
- which supersedes g_win32_get_package_installation_directory
- - Use alertable wait functions so that I/O completion routines or
- user-mode Asynchronous Procedure Calls can be run
- - Fix race conditions in g_spawn implementation on win32
-
-* Other:
- - g_uri_get_scheme has been renamed go g_uri_parse_scheme
-
-* Updated translations:
- Arabic (ar)
- Belarusian Latin (be@latin)
- Catalan (ca)
- British English (en_GB)
- Finnish (fi)
- Galician (gl)
- Hebrew (he)
- Italian (it)
- Kannada (kn)
- Norwegian bokmål (nb)
- Dutch (nl)
- Brazilian Portugese (pt_BR)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.15.4 to GLib 2.15.5
-===================================================
-
-* Update the included PCRE to 7.6
-
-* GIO:
- - g_volume_should_automount: new function to determine if a volume
- should be mounted automatically
- - g_file_query_default_handler: new convenience function to get
- the default handler for a file
- - g_app_info_launch_default_for_uri new convenience function to
- launch the default handler for a URI
- - Use mimeapps.list and defaults.list as discussed on xdg list
- recently
- - g_app_info_get_default_for_uri_scheme has a real implementation
- now (gvfs provides a GConf-based implementation)
- - There is the beginning of a test suite
- - standard::description: new file attribute
- - GMountMountFlags flags argument added to mount calls
-
-* GObject:
- - class initialization is now threadsafe
-
-* Updated translations:
- Arabic (ar)
- Catalan (ca)
- Spanish (es)
- Basque (eu)
- Italian (it)
- Japanese (ja)
- Kannada (kn)
- Korean (ko)
- Macedonian (mk)
- Occitan (oc)
- Portugese (pt)
- Brazilian Portugese (pt_BR)
- Swedish (sv)
- Thai (th)
-
-
-Overview of Changes from GLib 2.15.3 to GLib 2.15.4
-===================================================
-
-* G_GNUC_PRETTY_FUNCTION has been deprecated
-
-* GIO:
- - g_file_copy has an async variant now
- - Drives and volumes now have API to get identifiers
- like Hal UDIs or UUIDs.
- - There is now a registration API to let modules register
- extensions they provide, such as volume monitor implementations
-
-* Bugs fixed:
- 511807 g_time_val_to_iso8601() uses MT-unsafe gmtime() function
- 316260 [patch] Doc patches for gnode (2.8.1)
- 385132 solaris gettext support fix
- 484261 ./configure check for system PCRE unicode support fails w...
- 510292 GOption main help not shown
- 511580 Implement g_file_copy_async
- 511654 Compile errors due to C99 constructs
- 487909 g_utf8_strreverse and combining marks
- 512381 unused variable 'is_main_group'
-
-* Updated translations:
- Arabic (ar)
- Belarusian (be)
- Czech (cz)
- Spanish (es)
- French (fr)
- Galician (gl)
- Portugese (pt)
- Russian (ru)
- Swedish (sv)
- Thai (th)
-
-
-Overview of Changes from GLib 2.15.2 to GLib 2.15.3
-===================================================
-
-* GChecksum:
- - g_checksum_update can accept nul-terminated strings
- - The MD5 implementation works correctly on buffers
- that are longer than 64 bytes
-
-* GIO:
- - Don't include a copy of the inotify headers, rely on system headers
- - g_file_find_enclosing_mount has an async variant now
- - Reduntant seek API on file streams has been removed
-
-* Bugs fixed:
- 508602 gmemory{in|out}putstream.c: unknown pointer size
- 508771 There is no g_file_test/exists() for GFile
- 508773 g_uri_escape_string() documentation unclear.
- 509465 AM_PATH_GLIB_2_0 doesn't support gio
- 509626 async functions: Document allowed NULL callback?
- 509990 GSeekable documentation unclear
- 510448 No inotify support on ARM or SH5
- 510855 g_checksum_update(): Take -1 for length.
-
-* Updated translations:
- Basque (eu)
- Marathi (mr)
- Swedish (sv)
- Ukrainian (uk)
-
-
-Overview of Changes from GLib 2.15.1 to GLib 2.15.2
-===================================================
-
-* GIO:
- - Mount operation API change: unhandled methods get reported via
- the reply, rather than by the signal emission return value
- - File monitor API change: Add a GError argument to g_file_monitor_file
- - g_unix_mount_guess_should_display(): new function
-
-* Bugs fixed:
- 508224 [PATCH] FAM backend crashes due to double free
- 508074 GAsyncResult documentation suggests g_freeing it.
- 508108 GFile documentation slightly unclear.
- 508309 rpc_pipefs mount points should be hidden
- 508378 GFileInfo documentation implies that it changes attribute...
- 508719 g_file_get_relative_path fails if parent is root
- 508773 g_uri_escape_string() documentation unclear.
-
-* Updated translations:
- Arabic (ar)
- Spanish (es)
- Hebrew (he)
- Italian (it)
- Korean (ko)
- Turkish (tr)
-
-
-Overview of Changes from GLib 2.15.0 to GLib 2.15.1
-===================================================
-
- * Portability fixes:
- - Assertion functions are marked as noreturn again
- - Handling of inline functions has been fixed to work with gcc 4.3
- - C99 comments have been removed from headers
- - The nonportable sed -i option is no longer used
-
- * GIO:
- - Clarified the semantics of g_app_info_get_all()
- - API for memory input and output streams has been changed a bit
- - GDirectoryMonitor has been removed; GFileMonitor can monitor
- files and directories now
-
- * Bugs fixed:
- 504829 Invalid environment passed to g_spawn_async in g_desktop_...
- 505258 crash in Users and Groups: Adding a user
- 505815 g_content_types_get_registered should not g_free keys
- 491218 g_timer_new() doesn't initialize timer->end
- 315437 extern inline -> static inline
- 476856 Inconsistency between standard and implementation of the ...
- 480122 g_module_open fails to open modules with ".la" extension
- 495589 gspawn.c failing to set FD_CLOEXEC
- 500273 doesn't build with --disable-visibility
- 504142 Do not show empty groups in --help output
- 504879 giofam incorrectly linked
- 505042 add file attribute for actually used file size in bytes
- 505058 xattr namespace docs
- 505674 Misprint in the definition of the macro G_CCLOSURE_SWAP_DATA
- 505730 Fails to build on OSX 10.4: _NSGetEnviron not declared
- 505887 older darwin lacks lchown
- 506374 gmemoryinputstream api
- 506461 Conversion of g_assert_not_reached() and friends into fun...
- 503051 Small bug in glib interface
- 506395 Updates to GIO documentation
- 507628 Missing .pc entry for gio linking against glib
- 505195 [patch] typo in g_try_new0 docs
- 507822 g{file,directory}monitor changes signal problem
- 506377 gmemoryoutputstream write implementation
- 507835 bug in gunixinputstream
-
- * Updated translations:
- Arabic (ar)
- Belarusian Latin (be@latin)
- Spanish (es)
- Basque (eu)
- Irish (ga)
- Hebrew (he)
- Occitan (oc)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.14.x to GLib 2.15.0
-===================================================
-
-Major new features:
-
- * GIO: a VFS API, designed to replace GnomeVFS. The GIO implementation
- in GLib has support for local filesystems. The new, separate gvfs
- module contains various backend implementations (cifs, ftp, sftp,
- http, ...)
-
- * GChecksum: provides various hash algorithms, such as MD5, SHA-1
- and SHA-256
-
- * GTest: a test framework
-
-Smaller additions:
-
- * GHash:
- - GHash has iterators, as an alternative to g_hash_table_foreach
-
- * GMarkup:
- - g_markup_parse_context_get_element_stack: New function to
- get the stack of open elements
- - G_MARKUP_PREFIX_ERROR_POSITION: New flag to improve error
- reporting
- - g_markup_collect_attributes: Convenience function for handling
- attributes
-
-* GKeyFile:
- - Functions that take a GError now return a boolean to indicate
- success, instead of void
- - Various performance improvements
-
-* GAsyncQueue:
- - g_async_queue_new_full: new function that allows to specify
- a free function for leftover elements
-
-* GError:
- - g_prefix_error and g_propagate_prefixed_error: New functions
- to ease error propagation
-
-* Internationalization:
- - C_: A new 2-argument variant of the Q_() macro
- - Use native character set conversion API on Windows
-
-* GLib builds with automake 1.10
-
-* Bugs fixed:
- 455725 specific combination of g_utf8_strlen and g_pattern_match...
- 467537 g_convert_with_iconv() not resetting iconv() state correc...
- 497033 Commandline option parser should warn about missing optio...
- 504527 gchecksum: Conditional jump or move depends on uninitiali...
- 445362 Non-numeric local labels in gatomic.c are causing linker ...
- 482313 gregex: no way to tell why compilation failed
- 317775 main loops continues to run after g_main_loop_quit() has ...
- 418778 Insufficient pkg-config version requirement
- 436293 g_option_context_new() doc should mention that the string...
- 466557 glib-mkenums shifts ARGV[0] to undefined
- 468882 GKeyFile doesn't accept "True" as a true boolean value
- 469551 application --help messages are garbaged on none UTF-8 lo...
- 479724 Memory leak upon calling "g_main_loop_run" in the seconda...
- 490061 outptrs uninitialized after g_parse_long_long
- 490637 gobject documentation patch
- 495294 glib-genmarshal prints warnings but returns 0
- 496046 option to prefix location of errors for GMarkup
- 498113 tests/regex-test fails on 64bit environment
- 500506 Fails to build on OSX 10.4
- 500638 gkeyfile speedup ...
- 500875 Make check fails as there is no "test" target for "build"...
- 502511 g_assert_cmphex prints invalid message
- 502927 g_array_index triggers cast aligment warning
- 503029 g_time_val_from_iso8601 parse non-ISO8601 dates
- 503222 Need context to translate
- 503420 gkeyfile leaks a hash table
- 503470 Fix build when builddir != srcdir
- 504227 Inverse variant for g_test_trap_assert_stdout, g_test_tra...
- 71704 file include order
- 491957 Misprint in the specification of the interface "g_main_co...
- 491959 Misprint in description of the structure "GThreadPool"
- 491965 Mistype in the specification of the function "g_hook_list...
- 491966 Misprint in the specification of the interface "g_main_co...
- 491968 The documentation does not mention the restriction for th...
- 491970 The documentation for the interface "g_date_clamp" is inc...
- 491974 The documentation of the interface "g_main_context_iterat...
- 491975 The documentation for the interfaces "g_io_channel_read_u...
- 491979 Misprint in the description of the interfaces g_key_file_...
- 491982 Misprint in the description of the interface "g_key_file_...
- 501107 EXTRA_DIST automake warnings
- 501997 g_utf8_normalize() returns NULL on invalid string
- 502590 C_/g_dpgettext efficiency
- 464259 g_set_application_name() docs should say "Since 2.2"
- 496518 gbase64.c API doc clarification
- 498728 g_key_file_get_*_list should set length to 0 when returni...
- 500361 Improve docs for g_array_free() and g_ptr_array_free()
- 501853 g_checksum_get_digest docs
- 503862 Allow NULL strings in g_parse_debug_string()
- 142676 Q_
- 367550 Add g_async_queue_new_full() with GDestroyNotify function
- 375651 Minor enhancements to GKeyFile API
- 443648 MD5 digest support
- 449937 Upgrade auto* sources to be clean under automake1.9
- 452887 gmarkup context "get element" function is useless when ca...
- 491549 [PATCH] Eliminate libiconv dependency on Windows
- 500507 GHashTableIter API
-
-* Translation updates
- Belarusian Latin (be@latin)
- Czech (cs)
- German (de)
- Spanish (es)
- Esperanto (et)
- French (fr)
- Korean (ko)
- Marathi (mr)
- Norwegian bokmål (nb)
- Brazilian Portugese (pt_BR)
- Slovenian (sl)
- Swedish (sv)
-
-
-Overview of Changes from GLib 2.14.2 to GLib 2.14.3
-===================================================
-
-* Update PCRE to 7.4
-
-* Bugs fixed:
- 487491 Fix some warnings from sparse
- 488068 Small (one-time) memory leak in glib_gettext initialization
- 493688 TYPE macro "_get_type ()" is documented wrong
-
-* Updated translations:
- Arabic (ar)
- Belarusian Latin (be@latin)
- Estonian (et)
- Irish (ga)
- Slovenian (sl)
-
-
-Overview of Changes from GLib 2.14.1 to GLib 2.14.2
-===================================================
-
-* Bugs fixed:
- 476849 Invocation of the interface "g_hook_free" fails in certai...
- 359165 marshallers can throw warnings with -Wunused
- 477957 more discussion on g_value_set_object vs. g_value_take_ob...
- 478459 G_DEFINE_DYNAMIC_TYPE_EXTENDED doesn't work with G_IMPLEM...
- 483337 inline is disabled for MSVC when compiling C code
- 478349 Broken link to gettext website
- 469231 g_spawn optimization for setting all open fds to CLOEXEC
-
-* Updated translations:
-Arabic (ar)
-Galician (gl)
-Hebrew (he)
-Korean (ko)
-
-
-Overview of Changes from GLib 2.14.0 to GLib 2.14.1
-===================================================
-
-* Bugs fixed:
- 476840 Invocation of the interface "g_utf8_strreverse" crashes f...
- 444765 Fix FIXME in gregex.c when new pcre is out
- 464145 g_markup_escape_text Produces Invalid XML
- 465625 g_type_default_interface_ref() does not ensure working g_...
- 466768 Clearify that comments can be put anywhere in a Key-file.
- 474229 The GError documentation should give convention for the G...
- 474899 G_BREAKPOINT() docs inaccurate
- 475854 Overuse of -lpcre when using system pcre
- 473879 Incorrect includes in gregex.c
- 468694 Typoes in documentation
- 469051 g_snprintf () talks about characters where it probably me...
- 457601 Missing arch specific atomic implementation
- 475923 Missing pcre flags when static-linking against glib
- 475619 glibthread-2.0.la does not list -lpthread
-
-* Updated translations:
- Bulgarian (bg)
- Catalan (ca)
- Danish (da)
- German (de)
- Canadian English (en_CA)
- British English (en_GB)
- Spanish (es)
- Estonian (et)
- Finnish (fi)
- French (fr)
- Gujarati (gu)
- Hungarian (hu)
- Italian (it)
- Georgian (ka)
- Kannada (kn)
- Lithuanian (lt)
- Makedonian (mk)
- Norwegian (nb)
- Dutch (nl)
- Polish (pl)
- Portugese (pt)
- Brazilian Portugese (pt_BR)
- Romanian (ro)
- Russian (ru)
- Albanian (sq)
- Serbian (sr, sr@Latn)
- Swedish (sv)
- Tamil (ta)
- Thai (th)
- Ukrainian (uk)
- Vietnamese (vi)
-
-
-Overview of Changes from GLib 2.13.7 to GLib 2.14.0
-===================================================
-
-* Last-minute API additions:
- - Make g_unichar_combining_class public
- - Add goffset type, add G_MAXSSIZE and G_MINSSIZE
-
-* Update PCRE to 7.2
-
-* Bugs fixed:
- 453998 Make _g_unichar_combining_class() public
- 462549 gregex.c: variable is declared at middle of block
- 417068 g_file_test doc inconsistency
-
-* Updated translations:
- Assamese (as)
- Basque (eu)
- Kannada (kn)
- Malayalam (ml)
- Dutch (nl)
- Polish (pl)
- Brazilian Portugese (pt_BR)
- Turkish (tr)
-
-
-Overview of Changes from GLib 2.13.6 to GLib 2.13.7
-===================================================
-
-* The memory corruption warning from the slice allocator that
- occurred when threads were initialized after the slice allocator
- has been removed, as the slice allocator now works fine
- in this scenario.
-
-* New functions g_once_init_enter() and g_once_init_leave() make
- it easier to write threadsafe one-time initialization functions
-
-* Bugs fixed:
- 454473 Simple XML Subset Parser terminates on invalid XML
- 445813 g_module_open error, add file name
- 453796 errno gets clobbered by g_filename_display_name
- 341988 don't use "-c" with msgfmt in Makefile.in.in
- 447048 Please produce slightly more output during long tests
- 454785 GModule documentation lists same block of code twice.
- 454786 GModule documentation lists same paragraph twice.
- 383155 small docs quirks in gobject/closure API documentation
- 65041 _get_type() functions aren't thread safe
-
-* Updated translations
- Assamese (as)
- Spanish (es)
- Gujarati (gu)
- Japanese (ja)
- Korean (ko)
- Macedonian (mk)
-
-
-Overview of Changes from GLib 2.13.5 to GLib 2.13.6
-===================================================
-
-* Reintroduce a GType typedef whose removal in 2.13.5
- caused trouble for C++ bindings
-
-* Bugs fixed:
- 450216 docs not explicit enough about g_free()
- 451459 g_type_register_static_simple calls g_type_register_static
-
-* Updated translations
- Norwegian bokmål (nb)
- Sinhala (si)
-
-
-Overview of Changes from GLib 2.13.4 to GLib 2.13.5
-===================================================
-
-* xdg-user-dirs support:
- - the Desktop directory is guaranteed to be defined
- - user-dirs.dirs is no longer reloaded on changes
-
-* Slice allocator:
- - new api to duplicate slices
-
-* Regular expression support:
- - GRegex is a boxed type now
-
-* Bugs fixed:
- 44793 make check failing in trunk
- 354522 Small problem with PLT hiding 6 symbols
- 363986 glib 2.12.4 does not compile with SGI IDO cc
- 443869 g_type_class_add_private doesn't warn when adding 0-sized...
- 446859 Legitimately return 0 for g_quark_from_string(NULL)
- 447534 Small typo in g_timeout_add_seconds() doc
- 447583 GStaticRWLock
- 447935 g_get_current_dir SIGSEGV on long path
- 448260 CLAMP has surprising result if low > high
- 57693 g_string_vprintf()
- 442029 add g_slice_dup()
- 445065 Add GRegex boxed type
- 448819 Add full version of g_timeout_add_seconds()
-
-* Updated translations:
- Swedish (sv)
- Oriya (or)
- Hebrew (he)
- Spanish (es)
- Estonian (et)
-
-
-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/glib/README.in b/glib/README.in
index 07b3185..3537b7f 100644
--- a/glib/README.in
+++ b/glib/README.in
@@ -67,6 +67,41 @@ and attach the patch to that bug report.
Patches should be in unified diff form. (The -up option to GNU diff.)
+Notes about GLib 2.36
+=====================
+
+* It is no longer necessary to call g_type_init(). If you are
+ loading GLib as a dynamic module, you should be careful to avoid
+ unloading it, then subsequently loading it again. This never
+ really worked before, but it is now explicitly undefined behavior.
+ Note that if g_type_init() was the only explicit use of a GObject
+ API and you are using linker flags such as --no-add-needed, then
+ you may have to artificially use some GObject call to keep the
+ linker from optimizing away -lgobject. We recommend to use
+ g_type_ensure (G_TYPE_OBJECT) for this purpose.
+
+* This release contains an incompatible change to the g_get_home_dir()
+ function. Previously, this function would effectively ignore the HOME
+ environment variable and always return the value from /etc/password.
+ As of this version, the HOME variable is used if it is set and the
+ value from /etc/passwd is only used as a fallback.
+
+* The 'flowinfo' and 'scope_id' fields of GInetSocketAddress
+ (introduced in GLib 2.32) have been fixed to be in host byte order
+ rather than network byte order. This is an incompatible change, but
+ the previous behavior was clearly broken, so it seems unlikely that
+ anyone was using it.
+
+Notes about GLib 2.34
+=====================
+
+* GIO now looks for thumbnails in XDG_CACHE_HOME, following a
+ recent alignment of the thumbnail spec with the basedir spec.
+
+* The default values for GThreadPools max_unused_threads and
+ max_idle_time settings have been changed to 2 and 15*1000,
+ respectively.
+
Notes about GLib 2.32
=====================
diff --git a/glib/configure.ac b/glib/configure.ac
index 9e48cc9..ffa7869 100644
--- a/glib/configure.ac
+++ b/glib/configure.ac
@@ -30,9 +30,9 @@ m4_define(glib_configure_ac)
# <mclasen> on the unstable (ie master), interface age = 0
m4_define([glib_major_version], [2])
-m4_define([glib_minor_version], [32])
-m4_define([glib_micro_version], [4])
-m4_define([glib_interface_age], [4])
+m4_define([glib_minor_version], [38])
+m4_define([glib_micro_version], [2])
+m4_define([glib_interface_age], [2])
m4_define([glib_binary_age],
[m4_eval(100 * glib_minor_version + glib_micro_version)])
m4_define([glib_version],
@@ -56,14 +56,14 @@ m4_define([glib_debug_default],
AC_INIT(glib, [glib_version],
[http://bugzilla.gnome.org/enter_bug.cgi?product=glib])
-AC_CONFIG_HEADER([config.h])
+AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([glib/glib.h])
AC_CONFIG_MACRO_DIR([m4macros])
# Save this value here, since automake will set cflags later
cflags_set=${CFLAGS+set}
-AM_INIT_AUTOMAKE([1.11 no-define no-dist-gzip dist-xz tar-ustar foreign])
+AM_INIT_AUTOMAKE([1.11 -Wno-portability no-define no-dist-gzip dist-xz tar-ustar foreign])
AM_MAINTAINER_MODE([enable])
# Support silent build rules. Disable
@@ -111,6 +111,7 @@ AC_SUBST(LT_CURRENT_MINUS_AGE)
dnl Checks for programs.
AC_PROG_CC
AC_PROG_CPP
+AC_USE_SYSTEM_EXTENSIONS
AM_CONDITIONAL(HAVE_GCC, [test "$GCC" = "yes"])
@@ -150,6 +151,8 @@ case "$host" in
LIB_EXE_MACHINE_FLAG=X64
;;
esac
+
+ AC_DEFINE([_WIN32_WINNT], [0x0501], [Target the Windows XP API])
;;
*)
glib_native_win32=no
@@ -164,6 +167,17 @@ esac
AC_MSG_RESULT([$glib_native_win32])
+AC_MSG_CHECKING([for the Android])
+case $host in
+ *android*)
+ glib_native_android="yes"
+ ;;
+ *)
+ glib_native_android="no"
+ ;;
+esac
+AC_MSG_RESULT([$glib_native_android])
+
AC_SUBST(LIB_EXE_MACHINE_FLAG)
glib_have_carbon=no
@@ -193,7 +207,7 @@ AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"])
AM_CONDITIONAL(OS_CARBON, [test "$glib_have_carbon" = "yes"])
AM_CONDITIONAL(OS_COCOA, [test "$glib_have_cocoa" = "yes"])
-if test "$glib_native_win32" = "yes"; then
+AS_IF([test "$glib_native_win32" = "yes"], [
AC_CHECK_TOOL(WINDRES, windres, no)
if test "$WINDRES" = no; then
AC_MSG_ERROR([*** Could not find an implementation of windres in your PATH.])
@@ -203,74 +217,60 @@ if test "$glib_native_win32" = "yes"; then
AC_MSG_ERROR([*** Could not find an implementation of nm in your PATH.])
fi
AC_CHECK_TOOL(RANLIB, ranlib, :)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, :)
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
+AS_IF([test "x$glib_have_carbon" = "xyes"], [
AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available])
- LDFLAGS="$LDFLAGS -framework Carbon"
-fi
+ LDFLAGS="$LDFLAGS -Wl,-framework,Carbon"
+])
if test "x$glib_have_cocoa" = "xyes"; then
AC_DEFINE(HAVE_COCOA, 1, [define to 1 if Cocoa is available])
- LDFLAGS="$LDFLAGS -framework Foundation"
-fi
-
-gl_GLIBC21
-if test "x$GLIBC21" = "xyes"; then
- AC_DEFINE([_GNU_SOURCE], 1, [Make all glibc extensions visible])
+ LDFLAGS="$LDFLAGS -Wl,-framework,Foundation"
fi
dnl declare --enable-* args and collect ac_help strings
AC_ARG_ENABLE(debug,
- AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
+ AS_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],
+ [AS_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],
+ [AS_HELP_STRING([--disable-mem-pools],
[disable all glib memory pools])],,
[disable_mem_pools=no])
AC_ARG_ENABLE(rebuilds,
- [AC_HELP_STRING([--disable-rebuilds],
+ [AS_HELP_STRING([--disable-rebuilds],
[disable all source autogeneration rules])],,
[enable_rebuilds=yes])
+GLIB_TESTS
+
AC_MSG_CHECKING([whether to enable garbage collector friendliness])
-if test "x$enable_gc_friendly" = "xyes"; then
+AS_IF([test "x$enable_gc_friendly" = "xyes"], [
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_RESULT([no]) ])
AC_MSG_CHECKING([whether to disable memory pools])
-if test "x$disable_mem_pools" = "xno"; then
+AS_IF([test "x$disable_mem_pools" = "xno"], [
AC_MSG_RESULT([no])
-else
+], [
AC_DEFINE(DISABLE_MEM_POOLS, [1], [Whether to disable memory pools])
AC_MSG_RESULT([yes])
-fi
+])
dnl location to install runtime libraries, e.g. ../../lib to install
dnl to /lib if libdir is /usr/lib
AC_ARG_WITH(runtime-libdir,
- [AC_HELP_STRING([--with-runtime-libdir=RELPATH],
+ [AS_HELP_STRING([--with-runtime-libdir=RELPATH],
[install runtime libraries relative to libdir])],
[],
[with_runtime_libdir=""])
@@ -288,7 +288,6 @@ AC_TRY_COMPILE(,[class a { int b; } c;], ,CXX=)
AM_CONDITIONAL(HAVE_CXX, [test "$CXX" != ""])
AC_LANG_RESTORE
-AM_PROG_CC_STDC
AM_PROG_CC_C_O
AC_PROG_INSTALL
@@ -374,7 +373,16 @@ if test "x$PERL_PATH" = x ; then
fi
AC_SUBST(PERL_PATH)
-# Need suitable python path for greport
+# option to specify python interpreter to use; this just sets $PYTHON, so that
+# we will fallback to reading $PYTHON if --with-python is not given, and
+# python.m4 will get the expected input
+AC_ARG_WITH(python,
+ AS_HELP_STRING([--with-python=PATH],
+ [Path to Python interpreter; searches $PATH if only a program name is given; if not given, searches for a few standard names such as "python3" or "python2"]),
+ [PYTHON="$withval"], [])
+if test x"$PYTHON" = xyes; then
+ AC_MSG_ERROR([--with-python option requires a path or program argument])
+fi
AM_PATH_PYTHON(2.5,,PYTHON="/usr/bin/env python2.5")
@@ -386,11 +394,11 @@ dnl We do this before the gettext checks, to avoid distortion
dnl On Windows we use a native implementation
-if test x"$glib_native_win32" = xyes; then
+AS_IF([ test x"$glib_native_win32" = xyes], [
with_libiconv=native
-else
+], [
AC_ARG_WITH(libiconv,
- [AC_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@],
+ [AS_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@],
[use the libiconv library])],,
[with_libiconv=maybe])
@@ -422,34 +430,7 @@ else
if test "x$found_iconv" = "xno" ; then
AC_MSG_ERROR([*** No iconv() implementation found in C library or libiconv])
fi
-fi
-
-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
@@ -466,14 +447,14 @@ dnl
dnl Now we are done with gettext checks, figure out ICONV_LIBS
dnl
-if test x"$glib_native_win32" != xyes; then
+AS_IF([test x"$glib_native_win32" != xyes], [
if test x$with_libiconv != xno ; then
case " $INTLLIBS " in
*[[\ \ ]]-liconv[[\ \ ]]*) ;;
*) ICONV_LIBS="-liconv" ;;
esac
fi
-fi
+])
AC_SUBST(ICONV_LIBS)
case $with_libiconv in
@@ -497,14 +478,7 @@ dnl when using libtool 2.x create libtool early, because it's used in configure
m4_ifdef([LT_OUTPUT], [LT_OUTPUT])
-if test "x$GCC" = "xyes"; then
- case " $CFLAGS " in
- *[[\ \ ]]-Wall[[\ \ ]]*) ;;
- *) CFLAGS="$CFLAGS -Wall" ;;
- esac
-fi
-
-if test "$glib_native_win32" = "yes"; then
+AS_IF([test "$glib_native_win32" = "yes"], [
if test x$enable_static = xyes -a x$enable_shared = xyes; then
AC_MSG_ERROR([Can not build both shared and static at the same time on Windows.])
fi
@@ -514,13 +488,13 @@ if test "$glib_native_win32" = "yes"; then
#define GOBJECT_STATIC_COMPILATION 1"
AC_SUBST(GLIB_WIN32_STATIC_COMPILATION_DEFINE)
fi
-fi
+])
AM_CONDITIONAL(OS_WIN32_AND_DLL_COMPILATION, [test x$glib_native_win32 = xyes -a x$glib_win32_static_compilation != xyes])
dnl
dnl DU4 native cc currently needs -std1 for ANSI mode (instead of K&R)
dnl
-if test $cross_compiling != yes ; then
+AS_IF([test $cross_compiling != yes], [
AC_MSG_CHECKING([for extra flags to get ANSI library prototypes])
glib_save_LIBS=$LIBS
LIBS="$LIBS -lm"
@@ -539,7 +513,7 @@ if test $cross_compiling != yes ; then
)
)
LIBS=$glib_save_LIBS
-fi
+])
dnl NeXTStep cc seems to need this
AC_MSG_CHECKING([for extra flags for POSIX compliance])
@@ -556,9 +530,20 @@ AC_TRY_COMPILE([#include <dirent.h>], [DIR *dir;],
# Checks for library functions.
AC_FUNC_VPRINTF
AC_FUNC_ALLOCA
-AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2)
+AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid)
AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r)
+AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure,
+ [AC_TRY_LINK([#include <unistd.h>
+ extern int __libc_enable_secure;],
+ [return __libc_enable_secure;],
+ glib_cv_have_libc_enable_secure=yes,
+ glib_cv_have_libc_enable_secure=no)])
+AS_IF([test x$glib_cv_have_libc_enable_secure = xyes], [
+ AC_DEFINE(HAVE_LIBC_ENABLE_SECURE, 1,
+ [Define if you have the __libc_enable_secure variable (GNU libc, eglibc)])
+])
+
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(long)
@@ -588,7 +573,7 @@ else
])
fi
-if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then
+AS_IF([test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8], [
# 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,[
@@ -607,16 +592,14 @@ if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then
break],
[],[:])
done])
- if test -n "$glib_cv_long_long_format"; then
+ AS_IF([ test -n "$glib_cv_long_long_format"], [
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
+ fi
+ ], [AC_MSG_RESULT(none)])
+],[ test x$ac_cv_sizeof___int64 = x8], [
# __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
@@ -624,37 +607,10 @@ elif test x$ac_cv_sizeof___int64 = x8; 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])
AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64])
-fi
+])
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
@@ -768,7 +724,7 @@ call_a(2,3);
AC_MSG_RESULT($g_have_iso_c_varargs)
AC_MSG_CHECKING(for ISO C99 varargs macros in C++)
-if test "$CXX" = ""; then
+AS_IF([test "$CXX" = ""], [
dnl No C++ compiler
g_have_iso_cxx_varargs=no
else
@@ -779,7 +735,7 @@ int a(int p1, int p2, int p3);
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)
@@ -813,7 +769,7 @@ __attribute__ ((visibility ("default")))
f_default (void)
{
}
-int main (int argc, char **argv)
+int main (void)
{
f_hidden();
f_internal();
@@ -855,7 +811,7 @@ fi
AC_CHECK_HEADERS([dirent.h float.h limits.h pwd.h grp.h sys/param.h sys/poll.h sys/resource.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 inttypes.h sched.h malloc.h])
-AC_CHECK_HEADERS([sys/vfs.h sys/vmount.h sys/statfs.h sys/statvfs.h])
+AC_CHECK_HEADERS([sys/vfs.h sys/vmount.h sys/statfs.h sys/statvfs.h sys/filio.h])
AC_CHECK_HEADERS([mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h fstab.h])
AC_CHECK_HEADERS([sys/uio.h sys/mkdev.h])
AC_CHECK_HEADERS([linux/magic.h])
@@ -866,6 +822,7 @@ AC_CHECK_HEADERS([sys/mount.h sys/sysctl.h], [], [],
#include <sys/param.h>
#endif
])
+AC_CHECK_FUNCS(sysctlbyname)
AC_CHECK_HEADERS([xlocale.h])
@@ -894,11 +851,12 @@ AC_STRUCT_DIRENT_D_TYPE
AM_LANGINFO_CODESET
AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
AC_CHECK_FUNCS(setlocale)
+gl_GLIBC21
# check additional type sizes
AC_CHECK_SIZEOF(size_t)
-dnl Try to figure out whether gsize, gssize should be long or int
+dnl Try to figure out whether gsize should be long or int
AC_MSG_CHECKING([for the appropriate definition for size_t])
case $ac_cv_sizeof_size_t in
@@ -925,8 +883,8 @@ 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
+AS_IF([test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int &&
+ test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long], [
GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[
#if defined(_AIX) && !defined(__GNUC__)
#pragma options langlvl=stdc89
@@ -951,14 +909,97 @@ int main ()
return (int)*size_long;
}
]])],glib_size_type=long)])
-fi
+])
AC_MSG_RESULT(unsigned $glib_size_type)
+AC_CHECK_SIZEOF(ssize_t)
+
+dnl Try to figure out whether gssize should be long or int
+AC_MSG_CHECKING([for the appropriate definition for ssize_t])
+
+case $ac_cv_sizeof_ssize_t in
+ $ac_cv_sizeof_short)
+ glib_ssize_type=short
+ ;;
+ $ac_cv_sizeof_int)
+ glib_ssize_type=int
+ ;;
+ $ac_cv_sizeof_long)
+ glib_ssize_type=long
+ ;;
+ $ac_cv_sizeof_long_long)
+ glib_ssize_type='long long'
+ ;;
+ $ac_cv_sizeof__int64)
+ glib_ssize_type='__int64'
+ ;;
+ *) AC_MSG_ERROR([No type matching ssize_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 ssize_t. (This matters
+dnl on Android where ssize_t is long and size_t is unsigned int)
+dnl
+AS_IF([test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_int &&
+ test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_long], [
+ GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[
+#if defined(_AIX) && !defined(__GNUC__)
+#pragma options langlvl=stdc89
+#endif
+#include <stddef.h>
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+int main ()
+{
+ ssize_t s = 1;
+ int *size_int = &s;
+ return (int)*size_int;
+}
+ ]])],glib_ssize_type=int,
+ [GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[
+#if defined(_AIX) && !defined(__GNUC__)
+#pragma options langlvl=stdc89
+#endif
+#include <stddef.h>
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+int main ()
+{
+ ssize_t s = 1;
+ long *size_long = &s;
+ return (int)*size_long;
+}
+ ]])],glib_ssize_type=long)])
+])
+
+AC_MSG_RESULT($glib_ssize_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 memmem)
-AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid)
-AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat)
+AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid getresuid)
+AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat fallocate)
# Check for high-resolution sleep functions
AC_CHECK_FUNCS(splice)
AC_CHECK_FUNCS(prlimit)
@@ -1028,10 +1069,31 @@ if $glib_failed ; then
AC_MSG_ERROR([Could not determine values for MSG_* constants])
fi
-AC_CHECK_FUNCS(getprotobyname_r endservent if_nametoindex)
-AC_CHECK_HEADERS([netdb.h wspiapi.h arpa/nameser_compat.h])
+AC_CHECK_FUNCS(getprotobyname_r endservent if_nametoindex if_indextoname)
+
+AS_IF([test $glib_native_win32 = yes], [
+ # <wspiapi.h> in the Windows SDK and in mingw-w64 has wrappers for
+ # inline workarounds for getaddrinfo, getnameinfo and freeaddrinfo if
+ # they aren't present at run-time (on Windows 2000).
+ AC_CHECK_HEADER([wspiapi.h], [WSPIAPI_INCLUDE="#include <wspiapi.h>"])
+ AC_SUBST(WSPIAPI_INCLUDE)
+], [
+ # Android does not have C_IN in public headers, we define it wherever necessary
+ AS_IF([test $glib_native_android != yes], [
+ AC_MSG_CHECKING([if arpa/nameser_compat.h is needed])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <sys/types.h>
+ #include <arpa/nameser.h>],
+ [int qclass = C_IN;])],
+ [AC_MSG_RESULT([no])],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <sys/types.h>
+ #include <arpa/nameser.h>
+ #include <arpa/nameser_compat.h>],
+ [int qclass = C_IN;])],
+ [AC_MSG_RESULT([yes])
+ NAMESER_COMPAT_INCLUDE="#include <arpa/nameser_compat.h>"],
+ [AC_MSG_ERROR([could not compile test program either way])])])])
+ AC_SUBST(NAMESER_COMPAT_INCLUDE)
-if test $glib_native_win32 = no; then
# We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150
NETWORK_LIBS=""
AC_MSG_CHECKING([for res_query])
@@ -1062,7 +1124,20 @@ if test $glib_native_win32 = no; then
AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket,
[NETWORK_LIBS="-lsocket $NETWORK_LIBS"],
[AC_MSG_ERROR(Could not find socket())]))
-fi
+ save_libs="$LIBS"
+ LIBS="$LIBS $NETWORK_LIBS"
+ AC_MSG_CHECKING([for res_init])
+ AC_TRY_LINK([#include <sys/types.h>
+ #include <netinet/in.h>
+ #include <arpa/nameser.h>
+ #include <resolv.h>
+ ],[
+ res_init();
+ ],[AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_RES_INIT, 1, [Define to 1 if you have the 'res_init' function.])
+ ],[AC_MSG_RESULT([no])])
+ LIBS="$save_libs"
+])
AC_SUBST(NETWORK_LIBS)
AC_CHECK_HEADER([linux/netlink.h],
@@ -1085,7 +1160,7 @@ esac
dnl
dnl if statfs() takes 2 arguments (Posix) or 4 (Solaris)
dnl
-if test "$ac_cv_func_statfs" = yes ; then
+AS_IF([test "$ac_cv_func_statfs" = yes], [
AC_MSG_CHECKING([number of arguments to statfs()])
AC_TRY_COMPILE([#include <unistd.h>
#ifdef HAVE_SYS_PARAM_H
@@ -1121,14 +1196,14 @@ if test "$ac_cv_func_statfs" = yes ; then
AC_DEFINE(STATFS_ARGS, 4, [Number of arguments to statfs()])],[
AC_MSG_RESULT(unknown)
AC_MSG_ERROR([unable to determine number of arguments to statfs()])])])
-fi
+])
#
# Check whether to use an included printf
#
AC_ARG_ENABLE(included-printf,
- [AC_HELP_STRING([--enable-included-printf],
+ [AS_HELP_STRING([--enable-included-printf],
[use included printf [default=auto]])],
enable_included_printf="$enableval")
@@ -1157,14 +1232,14 @@ fi
enable_included_printf=$need_included_printf
AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_included_printf" != "yes")
-if test "$enable_included_printf" != "yes" ; then
+AS_IF([test "$enable_included_printf" != "yes"], [
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
@@ -1180,7 +1255,7 @@ 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
+AS_IF([test "$ac_cv_func_memmove" != "yes"], [
AC_CACHE_CHECK(whether bcopy can handle overlapping copies,
glib_cv_working_bcopy,[AC_TRY_RUN([
int main() {
@@ -1203,15 +1278,15 @@ if test "$ac_cv_func_memmove" != "yes"; then
if test "$glib_cv_working_bcopy" = "yes"; then
AC_DEFINE(HAVE_WORKING_BCOPY,1,[Have a working bcopy])
fi
-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
+AS_IF([test "$gtk_ok" = "yes"], [
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
@@ -1221,26 +1296,14 @@ 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_LANG_SAVE
+AC_LANG_C
AC_CACHE_CHECK([for nl_langinfo (CODESET)],glib_cv_langinfo_codeset,[
- AC_TRY_COMPILE([#include <langinfo.h>],
- [char *codeset = nl_langinfo (CODESET);],
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#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
@@ -1249,8 +1312,8 @@ fi
dnl Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c
AC_CACHE_CHECK([for nl_langinfo (PM_STR)],glib_cv_langinfo_time,[
- AC_TRY_COMPILE([#include <langinfo.h>],
- [char *str;
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <langinfo.h>],
+ [char *str;
str = nl_langinfo (PM_STR);
str = nl_langinfo (D_T_FMT);
str = nl_langinfo (D_FMT);
@@ -1259,7 +1322,7 @@ AC_CACHE_CHECK([for nl_langinfo (PM_STR)],glib_cv_langinfo_time,[
str = nl_langinfo (MON_1);
str = nl_langinfo (ABMON_12);
str = nl_langinfo (DAY_1);
- str = nl_langinfo (ABDAY_7);],
+ str = nl_langinfo (ABDAY_7);])],
[glib_cv_langinfo_time=yes],
[glib_cv_langinfo_time=no])])
if test x$glib_cv_langinfo_time = xyes; then
@@ -1268,7 +1331,7 @@ fi
dnl Check for nl_langinfo and _NL_CTYPE_OUTDIGITn_MB
AC_CACHE_CHECK([for nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)], glib_cv_langinfo_outdigit,[
- AC_TRY_COMPILE([#include <langinfo.h>],
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <langinfo.h>],
[char *str;
str = nl_langinfo (_NL_CTYPE_OUTDIGIT0_MB);
str = nl_langinfo (_NL_CTYPE_OUTDIGIT1_MB);
@@ -1279,12 +1342,13 @@ AC_CACHE_CHECK([for nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)], glib_cv_langinfo_outd
str = nl_langinfo (_NL_CTYPE_OUTDIGIT6_MB);
str = nl_langinfo (_NL_CTYPE_OUTDIGIT7_MB);
str = nl_langinfo (_NL_CTYPE_OUTDIGIT8_MB);
- str = nl_langinfo (_NL_CTYPE_OUTDIGIT9_MB);],
+ str = nl_langinfo (_NL_CTYPE_OUTDIGIT9_MB);])],
[glib_cv_langinfo_outdigit=yes],
[glib_cv_langinfo_outdigit=no])])
if test x$glib_cv_langinfo_outdigit = xyes; then
AC_DEFINE(HAVE_LANGINFO_OUTDIGIT,1,[Have nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)])
fi
+AC_LANG_RESTORE
dnl ****************************************
dnl *** posix_memalign ***
@@ -1321,12 +1385,12 @@ AC_CACHE_VAL(glib_cv_compliant_posix_memalign,[
:
fi
])
-if test "$glib_cv_compliant_posix_memalign" = "1"; then
+AS_IF([test "$glib_cv_compliant_posix_memalign" = "1"], [
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 ****************************************
@@ -1423,9 +1487,9 @@ AC_CACHE_CHECK([whether va_lists can be copied by value],glib_cv_va_val_copy,[
[glib_cv_va_val_copy=yes])
])
-if test "x$glib_cv_va_val_copy" = "xno"; then
+AS_IF([ test "x$glib_cv_va_val_copy" = "xno"], [
AC_DEFINE(G_VA_COPY_AS_ARRAY,1, ['va_lists' cannot be copies as values])
-fi
+])
dnl ***********************
dnl *** g_module checks ***
@@ -1458,45 +1522,45 @@ if test -z "$G_MODULE_IMPL"; then
esac
fi
dnl *** dlopen() and dlsym() in system libraries
-if test -z "$G_MODULE_IMPL"; then
+AS_IF([ test -z "$G_MODULE_IMPL"], [
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
+AS_IF([test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"], [
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
+AS_IF([ test -z "$G_MODULE_IMPL" ], [
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
+AS_IF([ test -z "$G_MODULE_IMPL"], [
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
+AS_IF([ test -z "$G_MODULE_IMPL"], [
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
+AS_IF([ test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL" ], [
LIBS_orig="$LIBS"
LDFLAGS_orig="$LDFLAGS"
LIBS="$G_MODULE_LIBS $LIBS"
@@ -1571,7 +1635,7 @@ dnl *** check for having 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
@@ -1641,34 +1705,13 @@ dnl *** Directory for GIO modules ***
dnl *********************************
AC_ARG_WITH(gio-module-dir,
- [AC_HELP_STRING([--with-gio-module-dir=DIR],
+ [AS_HELP_STRING([--with-gio-module-dir=DIR],
[load gio modules from this directory [LIBDIR/gio/modules]])],
[],
[with_gio_module_dir='${libdir}/gio/modules'])
GIO_MODULE_DIR=$with_gio_module_dir
AC_SUBST(GIO_MODULE_DIR)
-dnl **********************************
-dnl *** Check for libselinux (GIO) ***
-dnl **********************************
-AC_ARG_ENABLE(selinux,
- AC_HELP_STRING([--disable-selinux],
- [build without selinux support]))
-msg_selinux=no
-SELINUX_LIBS=
-if test "x$enable_selinux" != "xno"; then
-
- AC_CHECK_LIB(selinux, is_selinux_enabled,
- [AC_CHECK_HEADERS(selinux/selinux.h,
- [AC_CHECK_LIB(selinux, lgetfilecon_raw,
- [AC_DEFINE(HAVE_SELINUX, 1, [Define to 1 if libselinux is available])
- SELINUX_LIBS="-lselinux"
- msg_selinux=yes])
- ])
- ])
-fi
-AC_SUBST(SELINUX_LIBS)
-
dnl *****************************
dnl ** Check for inotify (GIO) **
dnl *****************************
@@ -1681,6 +1724,17 @@ AC_CHECK_HEADERS([sys/inotify.h],
AM_CONDITIONAL(HAVE_INOTIFY, [test "$inotify_support" = "yes"])
+dnl ****************************
+dnl ** Check for kqueue (GIO) **
+dnl ****************************
+kqueue_support=no
+AC_CHECK_HEADERS([sys/event.h],
+[
+ AC_CHECK_FUNCS(kqueue kevent, [kqueue_support=yes])
+])
+
+AM_CONDITIONAL(HAVE_KQUEUE, [test "$kqueue_support" = "yes"])
+
dnl *********************************
dnl ** Check for Solaris FEN (GIO) **
dnl *********************************
@@ -1698,62 +1752,6 @@ int main() { return 0; } ]])],
AM_CONDITIONAL(HAVE_FEN, [test "$fen_support" = "yes"])
-dnl *****************************
-dnl *** Check for xattr (GIO) ***
-dnl *****************************
-AC_ARG_ENABLE(xattr,
- AC_HELP_STRING([--disable-xattr], [build without xattr support]))
-msg_xattr=no
-XATTR_LIBS=
-if test "x$enable_xattr" != "xno"; then
-
-dnl either glibc or libattr can provide xattr support
-
-dnl for both of them, we check for getxattr being in
-dnl the library and a valid xattr header.
-
-dnl try glibc
- AC_CHECK_LIB(c, getxattr,
- [AC_CHECK_HEADERS(sys/xattr.h,
- [AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if xattr is available])
- msg_xattr=yes])
- ])
-
- if test "x$msg_xattr" != "xyes"; then
-dnl failure. try libattr
- AC_CHECK_LIB(attr, getxattr,
- [AC_CHECK_HEADERS(attr/xattr.h,
- [AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if xattr is available])
- XATTR_LIBS="-lattr"
- msg_xattr=yes])
- ])
- fi
-
- if test "x$msg_xattr" = "xyes"; then
- AC_MSG_CHECKING([for XATTR_NOFOLLOW])
- AC_TRY_COMPILE([
- #include <stdio.h>
- #ifdef HAVE_SYS_TYPES_H
- #include <sys/types.h>
- #endif
- #ifdef HAVE_SYS_XATTR_H
- #include <sys/xattr.h>
- #elif HAVE_ATTR_XATTR_H
- #include <attr/xattr.h>
- #endif
- ],
- [ssize_t len = getxattr("", "", NULL, 0, 0, XATTR_NOFOLLOW);],
- [
- AC_DEFINE([HAVE_XATTR_NOFOLLOW], [1], [Define to 1 if xattr API uses XATTR_NOFOLLOW])
- AC_MSG_RESULT([yes])
- ],
- [AC_MSG_RESULT([no])]
- )
- fi
-
-fi
-AC_SUBST(XATTR_LIBS)
-
dnl ****************************************
dnl *** platform dependent source checks ***
dnl ****************************************
@@ -1799,7 +1797,7 @@ dnl *** g_thread checks ***
dnl ***********************
AC_ARG_WITH(threads,
- [AC_HELP_STRING([--with-threads=@<:@posix/win32@:>@],
+ [AS_HELP_STRING([--with-threads=@<:@posix/win32@:>@],
[specify a thread implementation to use])],
[],
[with_threads=yes])
@@ -1840,17 +1838,17 @@ dnl ***************************************
AC_MSG_CHECKING(for thread implementation)
have_threads=no
-if test "x$with_threads" = xyes || test "x$with_threads" = xposix; then
+AS_IF([ test "x$with_threads" = xyes || test "x$with_threads" = xposix], [
# -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
+ AS_IF([ test "x$have_threads" = xno], [
AC_TRY_COMPILE([#include <pthread.h>],
[pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;],
have_threads=posix)
- fi
+ ])
# Tru64Unix requires -pthread to find pthread.h. See #103020
CPPFLAGS="$CPPFLAGS -pthread"
if test "x$have_threads" = xno; then
@@ -1859,7 +1857,7 @@ if test "x$with_threads" = xyes || test "x$with_threads" = xposix; then
have_threads=posix)
fi
CPPFLAGS="$glib_save_CPPFLAGS"
-fi
+])
if test "x$with_threads" = xyes || test "x$with_threads" = xwin32; then
case $host in
*-*-mingw*)
@@ -1898,7 +1896,7 @@ int main()
return (check_me != 42 || ret != &check_me);
}])
-if test x"$have_threads" = xposix; then
+AS_IF([ test x"$have_threads" = xposix], [
# 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
@@ -1933,9 +1931,9 @@ if test x"$have_threads" = xposix; then
done
;;
esac
-fi
+])
-if test x"$G_THREAD_CFLAGS" = x; then
+AS_IF([ test x"$G_THREAD_CFLAGS" = x], [
# The canonical -pthread[s] does not work. Try something different.
@@ -1974,8 +1972,7 @@ if test x"$G_THREAD_CFLAGS" = x; then
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
@@ -2003,11 +2000,10 @@ CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
dnl determination of G_THREAD_LIBS
dnl ******************************
-case $have_threads in
- posix)
+AS_IF([test x$have_threads = xposix], [
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
- if test x"$G_THREAD_LIBS" = x; then
+ AS_IF([ test x"$G_THREAD_LIBS" = x ], [
case $host in
*-aix*)
# We are not using gcc (would have set G_THREAD_LIBS) and thus
@@ -2053,20 +2049,23 @@ case $have_threads in
LIBS="$glib_save_LIBS"
;;
esac
- fi
+ ])
g_threads_impl="POSIX"
+ AC_DEFINE([THREADS_POSIX], [1], [Use pthreads])
AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES)
CPPFLAGS="$glib_save_CPPFLAGS"
- ;;
- win32)
+], [test x$have_threads = xwin32], [
+ AC_DEFINE([THREADS_WIN32], [1], [Use w32 threads])
g_threads_impl="WIN32"
- ;;
- *)
+], [
+ AC_DEFINE([THREADS_NONE], [1], [Use no threads])
g_threads_impl="NONE"
G_THREAD_LIBS=error
- ;;
-esac
+])
+AM_CONDITIONAL(THREADS_POSIX, [test "$g_threads_impl" = "POSIX"])
+AM_CONDITIONAL(THREADS_WIN32, [test "$g_threads_impl" = "WIN32"])
+AM_CONDITIONAL(THREADS_NONE, [test "$g_threads_impl" = "NONE"])
if test "x$G_THREAD_LIBS" = xerror; then
AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2)
@@ -2092,7 +2091,7 @@ glib_save_LIBS="$LIBS"
# to always be linked with the thread libs on some platforms.
# LIBS="$LIBS $G_THREAD_LIBS"
AC_CHECK_FUNCS(localtime_r gmtime_r)
-if test "$ac_cv_header_pwd_h" = "yes"; then
+AS_IF([ test "$ac_cv_header_pwd_h" = "yes"], [
AC_CACHE_CHECK([for posix getpwuid_r],
ac_cv_func_posix_getpwuid_r,
[AC_TRY_RUN([
@@ -2130,8 +2129,8 @@ int main () {
[Have non-POSIX function getpwuid_r])
fi
fi
-fi
-if test "$ac_cv_header_grp_h" = "yes"; then
+])
+AS_IF([ test "$ac_cv_header_grp_h" = "yes"], [
AC_CACHE_CHECK([for posix getgrgid_r],
ac_cv_func_posix_getgrgid_r,
[AC_TRY_RUN([
@@ -2150,10 +2149,10 @@ int main () {
[ac_cv_func_posix_getgrgid_r=yes],
[ac_cv_func_posix_getgrgid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_posix_getgrgid_r)
- if test "$ac_cv_func_posix_getgrgid_r" = yes; then
+ AS_IF([ test "$ac_cv_func_posix_getgrgid_r" = yes ], [
AC_DEFINE(HAVE_POSIX_GETGRGID_R,1,
[Have POSIX function getgrgid_r])
- else
+ ], [
AC_CACHE_CHECK([for nonposix getgrgid_r],
ac_cv_func_nonposix_getgrgid_r,
[AC_TRY_LINK([#include <grp.h>],
@@ -2168,10 +2167,10 @@ int main () {
AC_DEFINE(HAVE_NONPOSIX_GETGRGID_R,1,
[Have non-POSIX function getgrgid_r])
fi
- fi
-fi
+ ])
+])
LIBS="$G_THREAD_LIBS $LIBS"
-if test x"$have_threads" = xposix; then
+AS_IF([ test x"$have_threads" = xposix], [
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
# This is not AC_CHECK_FUNC to also work with function
@@ -2194,8 +2193,26 @@ if test x"$have_threads" = xposix; then
AC_DEFINE(HAVE_PTHREAD_CONDATTR_SETCLOCK,1,
[Have function pthread_condattr_setclock])],
[AC_MSG_RESULT(no)])
+ AC_MSG_CHECKING(for pthread_cond_timedwait_monotonic)
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [#include <pthread.h>],
+ [pthread_cond_timedwait_monotonic(NULL, NULL, NULL)])],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,1,
+ [Have function pthread_cond_timedwait_monotonic])],
+ [AC_MSG_RESULT(no)])
+ AC_MSG_CHECKING(for pthread_cond_timedwait_monotonic_np)
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [#include <pthread.h>],
+ [pthread_cond_timedwait_monotonic_np(NULL, NULL, NULL)])],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP,1,
+ [Have function pthread_cond_timedwait_monotonic_np])],
+ [AC_MSG_RESULT(no)])
CPPFLAGS="$glib_save_CPPFLAGS"
-fi
+])
LIBS="$glib_save_LIBS"
@@ -2216,6 +2233,9 @@ fi
# b) FreeBSD doesn't do this either.
#
case $host in
+ *android*)
+ G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS"
+ ;;
*-*-freebsd*|*-*-linux*)
G_THREAD_LIBS_FOR_GTHREAD="`echo $G_THREAD_LIBS | sed s/-pthread/-lpthread/`"
;;
@@ -2258,7 +2278,7 @@ dnl
dnl We can currently support the atomic ops natively when building GLib
dnl with recent versions of GCC or MSVC. MSVC doesn't run ./configure,
dnl so we skip that case here and define G_ATOMIC_LOCK_FREE exactly when
-dnl we are using GCC.
+dnl we are using GCC (and not mingw*).
dnl
dnl Note that the atomic ops are only available with GCC on x86 when
dnl using -march=i486 or higher. If we detect that the atomic ops are
@@ -2270,20 +2290,44 @@ dnl the user had the wrong build environment.
dnl We may add other compilers here in the future...
AC_CACHE_CHECK([for lock-free atomic intrinsics], glib_cv_g_atomic_lock_free, [
- AC_TRY_COMPILE([],
- [__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;],
- [glib_cv_g_atomic_lock_free=yes],
- [glib_cv_g_atomic_lock_free=no])])
-
-if test "$glib_cv_g_atomic_lock_free" = "no"; then
- SAVE_CFLAGS="${CFLAGS}"
- CFLAGS="-march=i486"
- AC_TRY_COMPILE([],
- [__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;],
- [AC_MSG_ERROR([GLib must be build with -march=i486 or later.])],
- [])
- CFLAGS="${SAVE_CFLAGS}"
-fi
+ case $host in
+ *-*-mingw*)
+ glib_cv_g_atomic_lock_free=yes
+ ;;
+ *)
+ AC_TRY_LINK([],
+ [volatile int atomic = 2;\
+ __sync_bool_compare_and_swap (&atomic, 2, 3);],
+ [glib_cv_g_atomic_lock_free=yes],
+ [glib_cv_g_atomic_lock_free=no])
+ if test "$glib_cv_g_atomic_lock_free" = "no"; then
+ SAVE_CFLAGS="${CFLAGS}"
+ CFLAGS="-march=i486"
+ AC_TRY_LINK([],
+ [volatile int atomic = 2;\
+ __sync_bool_compare_and_swap (&atomic, 2, 3);],
+ [AC_MSG_ERROR([GLib must be build with -march=i486 or later.])],
+ [])
+ CFLAGS="${SAVE_CFLAGS}"
+ fi
+ ;;
+ esac])
+
+
+case $host in
+ *-*-mingw*)
+ ;;
+ *)
+ # Some compilers support atomic operations but do not define
+ # __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4, like clang
+ if test x"$glib_cv_g_atomic_lock_free" = xyes; then
+ AC_TRY_LINK([],
+ [__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;],
+ [],
+ [AC_DEFINE(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4, 1, [ compiler supports atomic operations])])
+ fi
+ ;;
+ esac
dnl We need a more robust approach here...
case $host_cpu in
@@ -2345,8 +2389,8 @@ glib_poll_includes=["
#include <sys/poll.h>
"]
-if test $ac_cv_header_sys_types_h = yes &&
- test $ac_cv_header_sys_poll_h = yes ; then
+AS_IF([ test $ac_cv_header_sys_types_h = yes &&
+ test $ac_cv_header_sys_poll_h = yes ], [
glib_failed=false
GLIB_CHECK_VALUE(POLLIN, $glib_poll_includes, glib_failed=true)
GLIB_CHECK_VALUE(POLLOUT, $glib_poll_includes, glib_failed=true)
@@ -2357,14 +2401,14 @@ if test $ac_cv_header_sys_types_h = yes &&
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([[
@@ -2430,7 +2474,7 @@ AC_ARG_ENABLE(gcov,
[enable coverage testing with gcov]),
[use_gcov=$enableval], [use_gcov=no])
-if test "x$use_gcov" = "xyes"; then
+AS_IF([ test "x$use_gcov" = "xyes"], [
dnl we need gcc:
if test "$GCC" != "yes"; then
AC_MSG_ERROR([GCC is required for --enable-gcov])
@@ -2447,11 +2491,11 @@ if test "x$use_gcov" = "xyes"; then
AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.])
fi
- ltp_version_list="1.6 1.7 1.8 1.9"
+ ltp_version_list="1.6 1.7 1.8 1.9 1.10"
AC_CHECK_PROG(LTP, lcov, lcov)
AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml)
- if test "$LTP"; then
+ AS_IF([ test "$LTP" ], [
AC_CACHE_CHECK([for ltp version], glib_cv_ltp_version, [
glib_cv_ltp_version=invalid
ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'`
@@ -2461,10 +2505,10 @@ if test "x$use_gcov" = "xyes"; then
fi
done
])
- else
+ ], [
ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list"
AC_MSG_ERROR([$ltp_msg])
- fi
+ ])
case $glib_cv_ltp_version in
""|invalid[)]
@@ -2486,7 +2530,7 @@ if test "x$use_gcov" = "xyes"; then
dnl Add the special gcc flags
CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
LDFLAGS="$LDFLAGS -lgcov"
-fi
+])
dnl ******************************
dnl *** output the whole stuff ***
@@ -2612,19 +2656,21 @@ _______EOF
#define GLIB_SIZEOF_VOID_P $glib_void_p
#define GLIB_SIZEOF_LONG $glib_long
#define GLIB_SIZEOF_SIZE_T $glib_size_t
+#define GLIB_SIZEOF_SSIZE_T $glib_ssize_t
_______EOF
cat >>$outfile <<_______EOF
-typedef signed $glib_size_type_define gssize;
+typedef signed $glib_ssize_type_define gssize;
typedef unsigned $glib_size_type_define gsize;
#define G_GSIZE_MODIFIER $gsize_modifier
-#define G_GSSIZE_FORMAT $gssize_format
+#define G_GSSIZE_MODIFIER $gssize_modifier
#define G_GSIZE_FORMAT $gsize_format
+#define G_GSSIZE_FORMAT $gssize_format
#define G_MAXSIZE G_MAXU$glib_msize_type
-#define G_MINSSIZE G_MIN$glib_msize_type
-#define G_MAXSSIZE G_MAX$glib_msize_type
+#define G_MINSSIZE G_MIN$glib_mssize_type
+#define G_MAXSSIZE G_MAX$glib_mssize_type
typedef gint64 goffset;
#define G_MINOFFSET G_MININT64
@@ -2790,9 +2836,9 @@ _______EOF
#define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val))
#define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val))
#define GSIZE_TO_LE(val) ((gsize) GUINT${gsizebits}_TO_LE (val))
-#define GSSIZE_TO_LE(val) ((gssize) GINT${gsizebits}_TO_LE (val))
+#define GSSIZE_TO_LE(val) ((gssize) GINT${gssizebits}_TO_LE (val))
#define GSIZE_TO_BE(val) ((gsize) GUINT${gsizebits}_TO_BE (val))
-#define GSSIZE_TO_BE(val) ((gssize) GINT${gsizebits}_TO_BE (val))
+#define GSSIZE_TO_BE(val) ((gssize) GINT${gssizebits}_TO_BE (val))
#define G_BYTE_ORDER $g_byte_order
#define GLIB_SYSDEF_POLLIN =$g_pollin
@@ -2952,7 +2998,9 @@ $ac_cv_sizeof___int64)
;;
esac
glib_size_t=$ac_cv_sizeof_size_t
+glib_ssize_t=$ac_cv_sizeof_ssize_t
glib_size_type_define="$glib_size_type"
+glib_ssize_type_define="$glib_ssize_type"
glib_void_p=$ac_cv_sizeof_void_p
glib_long=$ac_cv_sizeof_long
@@ -2960,32 +3008,52 @@ 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'
;;
"long long"|__int64)
gsize_modifier='"I64"'
gsize_format='"I64u"'
- gssize_format='"I64i"'
glib_msize_type='INT64'
;;
esac
+case "$glib_ssize_type" in
+short)
+ gssize_modifier='"h"'
+ gssize_format='"hi"'
+ glib_mssize_type='SHRT'
+ ;;
+int)
+ gssize_modifier='""'
+ gssize_format='"i"'
+ glib_mssize_type='INT'
+ ;;
+long)
+ gssize_modifier='"l"'
+ gssize_format='"li"'
+ glib_mssize_type='LONG'
+ ;;
+"long long"|__int64)
+ gssize_modifier='"I64"'
+ gssize_format='"I64i"'
+ glib_mssize_type='INT64'
+ ;;
+esac
+
gintbits=`expr $ac_cv_sizeof_int \* 8`
glongbits=`expr $ac_cv_sizeof_long \* 8`
gsizebits=`expr $ac_cv_sizeof_size_t \* 8`
+gssizebits=`expr $ac_cv_sizeof_ssize_t \* 8`
case $ac_cv_sizeof_void_p in
$ac_cv_sizeof_int)
@@ -3204,19 +3272,13 @@ typedef unsigned $gint64 guint64;])
AC_CHECK_TYPE([unsigned long])
AC_CHECK_ALIGNOF([unsigned long])
-# Check for libdbus1 - Optional - is only used in the GDBus test cases
-#
-# 1.2.14 required for dbus_message_set_serial
-have_dbus1=no
-AM_CONDITIONAL(HAVE_DBUS1, [test "x$have_dbus1" = "xyes"])
-
dnl
dnl Check for -Bsymbolic-functions linker flag used to avoid
dnl intra-library PLT jumps, if available.
dnl
AC_ARG_ENABLE(Bsymbolic,
- [AC_HELP_STRING([--disable-Bsymbolic],
+ [AS_HELP_STRING([--disable-Bsymbolic],
[avoid linking with -Bsymbolic])],,
[SAVED_LDFLAGS="${LDFLAGS}"
AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
@@ -3234,6 +3296,54 @@ fi
AC_SUBST(GLIB_LINK_FLAGS)
+dnl
+dnl Check for -fvisibility=hidden to determine if we can do GNU-style
+dnl visibility attributes for symbol export control
+dnl
+GLIB_HIDDEN_VISIBILITY_CFLAGS=""
+case "$host" in
+ *-*-mingw*)
+ dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport)
+ AC_DEFINE([_GLIB_EXTERN], [__attribute__((visibility("default"))) __declspec(dllexport) extern],
+ [defines how to decorate public symbols while building])
+ CFLAGS="${CFLAGS} -fvisibility=hidden"
+ ;;
+ *)
+ dnl on other compilers, check if we can do -fvisibility=hidden
+ SAVED_CFLAGS="${CFLAGS}"
+ CFLAGS="-fvisibility=hidden"
+ AC_MSG_CHECKING([for -fvisibility=hidden compiler flag])
+ AC_TRY_COMPILE([], [int main (void) { return 0; }],
+ AC_MSG_RESULT(yes)
+ enable_fvisibility_hidden=yes,
+ AC_MSG_RESULT(no)
+ enable_fvisibility_hidden=no)
+ CFLAGS="${SAVED_CFLAGS}"
+
+ AS_IF([test "${enable_fvisibility_hidden}" = "yes"], [
+ AC_DEFINE([_GLIB_EXTERN], [__attribute__((visibility("default"))) extern],
+ [defines how to decorate public symbols while building])
+ GLIB_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden"
+ ])
+ ;;
+esac
+AC_SUBST(GLIB_HIDDEN_VISIBILITY_CFLAGS)
+
+dnl Compiler flags; macro originates from systemd
+dnl See https://bugzilla.gnome.org/show_bug.cgi?id=608953
+AC_ARG_ENABLE(compile-warnings,
+ [AS_HELP_STRING([--disable-compile-warnings],
+ [Don't use builtin compiler warnings])],,
+ enable_compile_warnings=yes)
+AS_IF([test "x$enable_compile_warnings" = xyes], [
+ CC_CHECK_FLAGS_APPEND([GLIB_WARN_CFLAGS], [CFLAGS], [\
+ -Wall -Wstrict-prototypes -Werror=declaration-after-statement \
+ -Werror=missing-prototypes -Werror=implicit-function-declaration \
+ -Werror=pointer-arith -Werror=init-self -Werror=format-security \
+ -Werror=format=2 -Werror=missing-include-dirs])
+])
+AC_SUBST(GLIB_WARN_CFLAGS)
+
#
# Define variables corresponding to the correct include paths to use for
# in-tree building.
@@ -3251,14 +3361,9 @@ AC_SUBST(config_h_INCLUDES)
glib_INCLUDES='$(config_h_INCLUDES) -I$(top_builddir)/glib -I$(top_srcdir)/glib -I$(top_srcdir)'
AC_SUBST(glib_INCLUDES)
-# gthread:
-# same as glib
-gthread_INCLUDES='$(glib_INCLUDES)'
-AC_SUBST(gthread_INCLUDES)
-
# gobject:
-# same as gthread
-gobject_INCLUDES='$(gthread_INCLUDES)'
+# same as glib
+gobject_INCLUDES='$(glib_INCLUDES)'
AC_SUBST(gobject_INCLUDES)
# gmodule:
diff --git a/glib/glib-gettextize.in b/glib/glib-gettextize.in
deleted file mode 100644
index 35d01c1..0000000
--- a/glib/glib-gettextize.in
+++ /dev/null
@@ -1,188 +0,0 @@
-#! /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/glib/glib.mk b/glib/glib.mk
new file mode 100644
index 0000000..75ac2c6
--- /dev/null
+++ b/glib/glib.mk
@@ -0,0 +1,225 @@
+# GLIB - Library of useful C routines
+
+#GTESTER = gtester # for non-GLIB packages
+#GTESTER_REPORT = gtester-report # for non-GLIB packages
+GTESTER = $(top_builddir)/glib/gtester # for the GLIB package
+GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package
+NULL =
+
+# initialize variables for unconditional += appending
+BUILT_SOURCES =
+BUILT_EXTRA_DIST =
+CLEANFILES = *.log *.trs
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+EXTRA_DIST =
+TEST_PROGS =
+
+installed_test_LTLIBRARIES =
+installed_test_PROGRAMS =
+installed_test_SCRIPTS =
+nobase_installed_test_DATA =
+
+noinst_LTLIBRARIES =
+noinst_PROGRAMS =
+noinst_SCRIPTS =
+noinst_DATA =
+
+check_LTLIBRARIES =
+check_PROGRAMS =
+check_SCRIPTS =
+check_DATA =
+
+TESTS =
+
+### testing rules
+
+# test: run all tests in cwd and subdirs
+test: test-nonrecursive
+if OS_UNIX
+ @ for subdir in $(SUBDIRS) . ; do \
+ test "$$subdir" = "." -o "$$subdir" = "po" || \
+ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \
+ done
+
+# test-nonrecursive: run tests only in cwd
+test-nonrecursive: ${TEST_PROGS}
+ @test -z "${TEST_PROGS}" || G_TEST_SRCDIR="$(abs_srcdir)" G_TEST_BUILDDIR="$(abs_builddir)" G_DEBUG=gc-friendly MALLOC_CHECK_=2 MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) ${GTESTER} --verbose ${TEST_PROGS}
+else
+test-nonrecursive:
+endif
+
+# test-report: run tests in subdirs and generate report
+# perf-report: run tests in subdirs with -m perf and generate report
+# full-report: like test-report: with -m perf and -m slow
+test-report perf-report full-report: ${TEST_PROGS}
+ @test -z "${TEST_PROGS}" || { \
+ case $@ in \
+ test-report) test_options="-k";; \
+ perf-report) test_options="-k -m=perf";; \
+ full-report) test_options="-k -m=perf -m=slow";; \
+ esac ; \
+ if test -z "$$GTESTER_LOGDIR" ; then \
+ G_TEST_SRCDIR="$(abs_srcdir)" G_TEST_BUILDDIR="$(abs_builddir)" ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \
+ elif test -n "${TEST_PROGS}" ; then \
+ G_TEST_SRCDIR="$(abs_srcdir)" G_TEST_BUILDDIR="$(abs_builddir)" ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \
+ fi ; \
+ }
+ @ ignore_logdir=true ; \
+ if test -z "$$GTESTER_LOGDIR" ; then \
+ GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \
+ ignore_logdir=false ; \
+ fi ; \
+ if test -d "$(top_srcdir)/.git" ; then \
+ REVISION=`git describe` ; \
+ else \
+ REVISION=$(VERSION) ; \
+ fi ; \
+ for subdir in $(SUBDIRS) . ; do \
+ test "$$subdir" = "." -o "$$subdir" = "po" || \
+ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \
+ done ; \
+ $$ignore_logdir || { \
+ echo '<?xml version="1.0"?>' > $@.xml ; \
+ echo '<report-collection>' >> $@.xml ; \
+ echo '<info>' >> $@.xml ; \
+ echo ' <package>$(PACKAGE)</package>' >> $@.xml ; \
+ echo ' <version>$(VERSION)</version>' >> $@.xml ; \
+ echo " <revision>$$REVISION</revision>" >> $@.xml ; \
+ echo '</info>' >> $@.xml ; \
+ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \
+ sed '1,1s/^<?xml\b[^>?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \
+ done ; \
+ echo >> $@.xml ; \
+ echo '</report-collection>' >> $@.xml ; \
+ rm -rf "$$GTESTER_LOGDIR"/ ; \
+ ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \
+ }
+.PHONY: test test-report perf-report full-report test-nonrecursive
+
+.PHONY: lcov genlcov lcov-clean
+# use recursive makes in order to ignore errors during check
+lcov:
+ -$(MAKE) $(AM_MAKEFLAGS) -k check
+ $(MAKE) $(AM_MAKEFLAGS) genlcov
+
+# we have to massage the lcov.info file slightly to hide the effect of libtool
+# placing the objects files in the .libs/ directory separate from the *.c
+# we also have to delete tests/.libs/libmoduletestplugin_*.gcda
+genlcov:
+ rm -f $(top_builddir)/tests/.libs/libmoduletestplugin_*.gcda
+ $(LTP) --directory $(top_builddir) --capture --output-file glib-lcov.info --test-name GLIB_PERF --no-checksum --compat-libtool
+ LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory glib-lcov --title "GLib Code Coverage" --legend --show-details glib-lcov.info
+ @echo "file://$(abs_top_builddir)/glib-lcov/index.html"
+
+lcov-clean:
+ -$(LTP) --directory $(top_builddir) -z
+ -rm -rf glib-lcov.info glib-lcov
+ -find -name '*.gcda' -print | xargs rm
+
+# run tests in cwd as part of make check
+check-local: test-nonrecursive
+
+# We support a fairly large range of possible variables. It is expected that all types of files in a test suite
+# will belong in exactly one of the following variables.
+#
+# First, we support the usual automake suffixes, but in lowercase, with the customary meaning:
+#
+# test_programs, test_scripts, test_data, test_ltlibraries
+#
+# The above are used to list files that are involved in both uninstalled and installed testing. The
+# test_programs and test_scripts are taken to be actual testcases and will be run as part of the test suite.
+# Note that _data is always used with the nobase_ automake variable name to ensure that installed test data is
+# installed in the same way as it appears in the package layout.
+#
+# In order to mark a particular file as being only for one type of testing, use 'installed' or 'uninstalled',
+# like so:
+#
+# installed_test_programs, uninstalled_test_programs
+# installed_test_scripts, uninstalled_test_scripts
+# installed_test_data, uninstalled_test_data
+# installed_test_ltlibraries, uninstalled_test_ltlibraries
+#
+# Additionally, we support 'extra' infixes for programs and scripts. This is used for support programs/scripts
+# that should not themselves be run as testcases (but exist to be used from other testcases):
+#
+# test_extra_programs, installed_test_extra_programs, uninstalled_test_extra_programs
+# test_extra_scripts, installed_test_extra_scripts, uninstalled_test_extra_scripts
+#
+# Additionally, for _scripts and _data, we support the customary dist_ prefix so that the named script or data
+# file automatically end up in the tarball.
+#
+# dist_test_scripts, dist_test_data, dist_test_extra_scripts
+# dist_installed_test_scripts, dist_installed_test_data, dist_installed_test_extra_scripts
+# dist_uninstalled_test_scripts, dist_uninstalled_test_data, dist_uninstalled_test_extra_scripts
+#
+# Note that no file is automatically disted unless it appears in one of the dist_ variables. This follows the
+# standard automake convention of not disting programs scripts or data by default.
+#
+# test_programs, test_scripts, uninstalled_test_programs and uninstalled_test_scripts (as well as their disted
+# variants) will be run as part of the in-tree 'make check'. These are all assumed to be runnable under
+# gtester. That's a bit strange for scripts, but it's possible.
+
+# we use test -z "$(TEST_PROGS)" above, so make sure we have no extra whitespace...
+TEST_PROGS += $(strip $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \
+ $(dist_test_scripts) $(dist_uninstalled_test_scripts))
+
+if OS_WIN32
+TESTS += $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \
+ $(dist_test_scripts) $(dist_uninstalled_test_scripts)
+endif
+
+# Note: build even the installed-only targets during 'make check' to ensure that they still work.
+# We need to do a bit of trickery here and manage disting via EXTRA_DIST instead of using dist_ prefixes to
+# prevent automake from mistreating gmake functions like $(wildcard ...) and $(addprefix ...) as if they were
+# filenames, including removing duplicate instances of the opening part before the space, eg. '$(addprefix'.
+all_test_programs = $(test_programs) $(uninstalled_test_programs) $(installed_test_programs) \
+ $(test_extra_programs) $(uninstalled_test_extra_programs) $(installed_test_extra_programs)
+all_test_scripts = $(test_scripts) $(uninstalled_test_scripts) $(installed_test_scripts) \
+ $(test_extra_scripts) $(uninstalled_test_extra_scripts) $(installed_test_extra_scripts)
+all_dist_test_scripts = $(dist_test_scripts) $(dist_uninstalled_test_scripts) $(dist_installed_test_scripts) \
+ $(dist_test_extra_scripts) $(dist_uninstalled_test_extra_scripts) $(dist_installed_test_extra_scripts)
+all_test_scripts += $(all_dist_test_scripts)
+EXTRA_DIST += $(all_dist_test_scripts)
+all_test_data = $(test_data) $(uninstalled_test_data) $(installed_test_data)
+all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data)
+all_test_data += $(all_dist_test_data)
+EXTRA_DIST += $(all_dist_test_data)
+all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries)
+
+if ENABLE_ALWAYS_BUILD_TESTS
+noinst_LTLIBRARIES += $(all_test_ltlibs)
+noinst_PROGRAMS += $(all_test_programs)
+noinst_SCRIPTS += $(all_test_scripts)
+noinst_DATA += $(all_test_data)
+else
+check_LTLIBRARIES += $(all_test_ltlibs)
+check_PROGRAMS += $(all_test_programs)
+check_SCRIPTS += $(all_test_scripts)
+check_DATA += $(all_test_data)
+endif
+
+if ENABLE_INSTALLED_TESTS
+installed_test_PROGRAMS += $(test_programs) $(installed_test_programs) \
+ $(test_extra_programs) $(installed_test_extra_programs)
+installed_test_SCRIPTS += $(test_scripts) $(installed_test_scripts) \
+ $(test_extra_scripts) $(test_installed_extra_scripts)
+installed_test_SCRIPTS += $(dist_test_scripts) $(dist_test_extra_scripts) \
+ $(dist_installed_test_scripts) $(dist_installed_test_extra_scripts)
+nobase_installed_test_DATA += $(test_data) $(installed_test_data)
+nobase_installed_test_DATA += $(dist_test_data) $(dist_installed_test_data)
+installed_test_LTLIBRARIES += $(test_ltlibraries) $(installed_test_ltlibraries)
+installed_testcases = $(test_programs) $(installed_test_programs) \
+ $(test_scripts) $(installed_test_scripts) \
+ $(dist_test_scripts) $(dist_installed_test_scripts)
+
+installed_test_meta_DATA = $(installed_testcases:=.test)
+
+%.test: %$(EXEEXT) Makefile
+ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \
+ echo 'Type=session' >> $@.tmp; \
+ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \
+ mv $@.tmp $@)
+
+CLEANFILES += $(installed_test_meta_DATA)
+endif
diff --git a/glib/glib/Makefile.am b/glib/glib/Makefile.am
index a881f17..d46e39b 100644
--- a/glib/glib/Makefile.am
+++ b/glib/glib/Makefile.am
@@ -1,9 +1,5 @@
## Process this file with automake to produce Makefile.in
-include $(top_srcdir)/Makefile.decl
-
-BUILT_SOURCES =
-DISTCLEANFILES =
-CLEANFILES =
+include $(top_srcdir)/glib.mk
#
# Generate glibconfig.h
@@ -31,7 +27,6 @@ printf_la = gnulib/libgnulib.la
endif
SUBDIRS = libcharset $(PRINTF_SUBDIR) .
-
DIST_SUBDIRS = libcharset gnulib
AM_CPPFLAGS = \
@@ -42,14 +37,7 @@ AM_CPPFLAGS = \
-DGLIB_COMPILATION \
-DPCRE_STATIC
-glib.def: glib.symbols
- $(AM_V_GEN) (echo EXPORTS; $(CPP) -P -DG_OS_WIN32 - <$(srcdir)/glib.symbols | sed -e '/^$$/d' -e 's/^/ /') > $(builddir)/glib.def
-
-if OS_LINUX
-if HAVE_GNUC_VISIBILITY
-TESTS_ENVIRONMENT = GLIB_DEBUG_FLAGS="$(GLIB_DEBUG_FLAGS)"
-endif
-endif
+AM_CFLAGS = $(GLIB_WARN_CFLAGS)
MIRRORING_TAB_SOURCE = \
glib-mirroring-tab/Makefile \
@@ -62,22 +50,20 @@ EXTRA_DIST += \
gen-iswide-table.py \
gen-unicode-tables.pl \
gen-script-table.pl \
- abicheck.sh \
- glib.symbols \
win_iconv.c \
docs.c \
gconstructor.h \
$(MIRRORING_TAB_SOURCE)
# These may be in the builddir too
-BUILT_EXTRA_DIST = \
+BUILT_EXTRA_DIST += \
glib.rc
noinst_LTLIBRARIES = libglib-2.0.la
if OS_WIN32_AND_DLL_COMPILATION
if MS_LIB_AVAILABLE
-noinst_DATA = glib-2.0.lib
+noinst_DATA += glib-2.0.lib
install_ms_lib_cmd = $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir)
uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/glib-2.0.lib
@@ -111,6 +97,7 @@ libglib_2_0_la_SOURCES = \
gbytes.c \
gbytes.h \
gcharset.c \
+ gcharsetprivate.h \
gchecksum.c \
gconvert.c \
gdataset.c \
@@ -141,6 +128,7 @@ libglib_2_0_la_SOURCES = \
gmarkup.c \
gmem.c \
gmessages.c \
+ gmessages-private.h \
gmirroringtable.h \
gnode.c \
goption.c \
@@ -148,6 +136,7 @@ libglib_2_0_la_SOURCES = \
gpoll.c \
gprimes.c \
gqsort.c \
+ gquark.c \
gqueue.c \
grand.c \
gscanner.c \
@@ -195,17 +184,20 @@ libglib_2_0_la_SOURCES = \
gwakeup.h \
gwakeup.c \
gprintf.c \
- gprintfint.h
+ gprintfint.h \
+ valgrind.h
if OS_UNIX
libglib_2_0_la_SOURCES += glib-unix.c
endif
-if OS_WIN32
+if THREADS_WIN32
libglib_2_0_la_SOURCES += gthread-win32.c
else
+if THREADS_POSIX
libglib_2_0_la_SOURCES += gthread-posix.c
endif
+endif
EXTRA_libglib_2_0_la_SOURCES = \
giounix.c \
@@ -316,31 +308,17 @@ no_undefined = -no-undefined
endif
if OS_WIN32_AND_DLL_COMPILATION
-export_symbols = -export-symbols $(builddir)/glib.def
-
glib_win32_res = glib-win32-res.o
glib_win32_res_ldflag = -Wl,$(glib_win32_res)
-
-glib_def = glib.def
-
-install-def-file:
- $(INSTALL) $(builddir)/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
+libglib_2_0_la_CFLAGS = $(AM_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS)
libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ $(pcre_lib) $(G_THREAD_LIBS_EXTRA) $(G_THREAD_LIBS_FOR_GTHREAD)
libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ $(glib_win32_res) $(glib_def)
libglib_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \
$(glib_win32_res_ldflag) \
- -export-dynamic $(no_undefined) $(export_symbols)
+ -export-dynamic $(no_undefined)
gspawn-win32-helper-console.c:
echo '#define HELPER_CONSOLE' >$@
diff --git a/glib/glib/abicheck.sh b/glib/glib/abicheck.sh
deleted file mode 100755
index 3137794..0000000
--- a/glib/glib/abicheck.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#! /bin/sh
-
-egrep '^#([^i]|if).*[^\]$' "${builddir:-.}/glibconfig.h" > glibconfig.cpp
-
-INCLUDES="-include ${top_builddir:-..}/config.h"
-INCLUDES="$INCLUDES -include glibconfig.cpp $GLIB_DEBUG_FLAGS"
-
-cpp -P -DG_STDIO_NO_WRAP_ON_UNIX $INCLUDES "${srcdir:-.}/glib.symbols" | sed -e '/^$/d' -e 's/ PRIVATE$//' | sort > expected-abi
-rm -f glibconfig.cpp
-
-nm -D -g --defined-only .libs/libglib-2.0.so | cut -d ' ' -f 3 | egrep -v '^(__bss_start|_edata|_end)' | sort > actual-abi
-
-diff -u expected-abi actual-abi && rm -f expected-abi actual-abi
diff --git a/glib/glib/deprecated/gallocator.h b/glib/glib/deprecated/gallocator.h
index e4990e9..a3dc2a1 100644
--- a/glib/glib/deprecated/gallocator.h
+++ b/glib/glib/deprecated/gallocator.h
@@ -15,13 +15,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_ALLOCATOR_H__
+#define __G_ALLOCATOR_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ALLOCATOR_H__
-#define __G_ALLOCATOR_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
diff --git a/glib/glib/deprecated/gcache.c b/glib/glib/deprecated/gcache.c
index 4968c32..5a59365 100644
--- a/glib/glib/deprecated/gcache.c
+++ b/glib/glib/deprecated/gcache.c
@@ -136,11 +136,12 @@ g_cache_node_destroy (GCacheNode *node)
/**
* GCacheNewFunc:
* @key: a #GCache key
- * @Returns: a new #GCache value corresponding to the key.
*
* 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.
+ *
+ * Returns: a new #GCache value corresponding to the key.
*/
/**
@@ -157,12 +158,13 @@ g_cache_node_destroy (GCacheNode *node)
* GCacheDupFunc:
* @value: the #GCache key to destroy (<emphasis>not</emphasis> a
* #GCache value as it seems)
- * @Returns: a copy of the #GCache key
*
* 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.
+ *
+ * Returns: a copy of the #GCache key
*/
GCache*
g_cache_new (GCacheNewFunc value_new_func,
diff --git a/glib/glib/deprecated/gcache.h b/glib/glib/deprecated/gcache.h
index 2e5119b..a7854e0 100644
--- a/glib/glib/deprecated/gcache.h
+++ b/glib/glib/deprecated/gcache.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_CACHE_H__
+#define __G_CACHE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_CACHE_H__
-#define __G_CACHE_H__
-
#include <glib/glist.h>
G_BEGIN_DECLS
diff --git a/glib/glib/deprecated/gcompletion.c b/glib/glib/deprecated/gcompletion.c
index 620af0e..fb5ab61 100644
--- a/glib/glib/deprecated/gcompletion.c
+++ b/glib/glib/deprecated/gcompletion.c
@@ -86,11 +86,12 @@
/**
* GCompletionFunc:
* @Param1: the completion item.
- * @Returns: the string corresponding to the item.
*
* 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.
+ *
+ * Returns: the string corresponding to the item.
**/
/**
@@ -98,14 +99,15 @@
* @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.
*
* Specifies the type of the function passed to
* g_completion_set_compare(). This is used when you use strings as
* #GCompletion items.
+ *
+ * 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.
**/
static void completion_check_cache (GCompletion* cmp,
@@ -116,9 +118,10 @@ static void completion_check_cache (GCompletion* cmp,
* @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.
*
* Creates a new #GCompletion.
+ *
+ * Returns: the new #GCompletion.
**/
GCompletion*
g_completion_new (GCompletionFunc func)
@@ -138,7 +141,7 @@ g_completion_new (GCompletionFunc func)
/**
* g_completion_add_items:
* @cmp: the #GCompletion.
- * @items: the list of items to add.
+ * @items: (transfer none): the list of items to add.
*
* Adds items to the #GCompletion.
*
@@ -176,9 +179,11 @@ g_completion_add_items (GCompletion* cmp,
/**
* g_completion_remove_items:
* @cmp: the #GCompletion.
- * @items: the items to remove.
+ * @items: (transfer none): the items to remove.
*
- * Removes items from a #GCompletion.
+ * Removes items from a #GCompletion. The items are not freed, so if the memory
+ * was dynamically allocated, free @items with g_list_free_full() after calling
+ * this function.
*
* Deprecated: 2.26: Rarely used API
**/
@@ -209,7 +214,9 @@ g_completion_remove_items (GCompletion* cmp,
* g_completion_clear_items:
* @cmp: the #GCompletion.
*
- * Removes all items from the #GCompletion.
+ * Removes all items from the #GCompletion. The items are not freed, so if the
+ * memory was dynamically allocated, it should be freed after calling this
+ * function.
*
* Deprecated: 2.26: Rarely used API
**/
@@ -332,12 +339,13 @@ g_completion_complete_utf8 (GCompletion *cmp,
* 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.
*
* Attempts to complete the string @prefix using the #GCompletion
* target items.
*
+ * Returns: (transfer none): the list of items whose strings begin with
+ * @prefix. This should not be changed.
+ *
* Deprecated: 2.26: Rarely used API
**/
GList*
@@ -406,7 +414,9 @@ g_completion_complete (GCompletion* cmp,
* g_completion_free:
* @cmp: the #GCompletion.
*
- * Frees all memory used by the #GCompletion.
+ * Frees all memory used by the #GCompletion. The items are not freed, so if
+ * the memory was dynamically allocated, it should be freed after calling this
+ * function.
*
* Deprecated: 2.26: Rarely used API
**/
diff --git a/glib/glib/deprecated/gcompletion.h b/glib/glib/deprecated/gcompletion.h
index 88a0479..fa77596 100644
--- a/glib/glib/deprecated/gcompletion.h
+++ b/glib/glib/deprecated/gcompletion.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_COMPLETION_H__
+#define __G_COMPLETION_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_COMPLETION_H__
-#define __G_COMPLETION_H__
-
#include <glib/glist.h>
G_BEGIN_DECLS
diff --git a/glib/glib/deprecated/gmain.h b/glib/glib/deprecated/gmain.h
index d1ddf19..bb62240 100644
--- a/glib/glib/deprecated/gmain.h
+++ b/glib/glib/deprecated/gmain.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_DEPRECATED_MAIN_H__
+#define __G_DEPRECATED_MAIN_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DEPRECATED_MAIN_H__
-#define __G_DEPRECATED_MAIN_H__
-
#include <glib/gmain.h>
G_BEGIN_DECLS
diff --git a/glib/glib/deprecated/grel.c b/glib/glib/deprecated/grel.c
index a8b2c4d..7f6fdff 100644
--- a/glib/glib/deprecated/grel.c
+++ b/glib/glib/deprecated/grel.c
@@ -185,11 +185,12 @@ tuple_equal (gint fields)
/**
* g_relation_new:
* @fields: the number of fields.
- * @Returns: a new #GRelation.
*
* Creates a new #GRelation with the given number of fields. Note that
* currently the number of fields must be 2.
*
+ * Returns: a new #GRelation.
+ *
* Deprecated: 2.26: Rarely used API
**/
GRelation*
@@ -375,11 +376,12 @@ g_relation_delete_tuple (gpointer tuple_key,
* @relation: a #GRelation.
* @key: the value to compare with.
* @field: the field of each record to match.
- * @Returns: the number of records deleted.
*
* Deletes any records from a #GRelation that have the given key value
* in the given field.
*
+ * Returns: the number of records deleted.
+ *
* Deprecated: 2.26: Rarely used API
**/
gint
@@ -439,12 +441,13 @@ g_relation_select_tuple (gpointer tuple_key,
* @relation: a #GRelation.
* @key: the value to compare with.
* @field: the field of each record to match.
- * @Returns: the records (tuples) that matched.
*
* 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().
*
+ * Returns: the records (tuples) that matched.
+ *
* Deprecated: 2.26: Rarely used API
**/
GTuples*
@@ -486,11 +489,12 @@ g_relation_select (GRelation *relation,
* @relation: a #GRelation.
* @key: the value to compare with.
* @field: the field of each record to match.
- * @Returns: the number of matches.
*
* Returns the number of tuples in a #GRelation that have the given
* value in the given field.
*
+ * Returns: the number of matches.
+ *
* Deprecated: 2.26: Rarely used API
**/
gint
@@ -520,12 +524,13 @@ g_relation_count (GRelation *relation,
* @relation: a #GRelation.
* @...: the fields of the record to compare. The number must match
* the number of fields in the #GRelation.
- * @Returns: %TRUE if a record matches.
*
* 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.
*
+ * Returns: %TRUE if a record matches.
+ *
* Deprecated: 2.26: Rarely used API
**/
gboolean
@@ -578,12 +583,13 @@ g_tuples_destroy (GTuples *tuples0)
* @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.
*
* 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.
*
+ * Returns: the field of the record.
+ *
* Deprecated: 2.26: Rarely used API
**/
gpointer
diff --git a/glib/glib/deprecated/grel.h b/glib/glib/deprecated/grel.h
index c9e0996..b76e006 100644
--- a/glib/glib/deprecated/grel.h
+++ b/glib/glib/deprecated/grel.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_REL_H__
+#define __G_REL_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_REL_H__
-#define __G_REL_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
diff --git a/glib/glib/deprecated/gthread-deprecated.c b/glib/glib/deprecated/gthread-deprecated.c
index a3cba18..89dba4d 100644
--- a/glib/glib/deprecated/gthread-deprecated.c
+++ b/glib/glib/deprecated/gthread-deprecated.c
@@ -196,6 +196,7 @@ g_thread_get_initialized (void)
}
/* We need this for ABI compatibility */
+GLIB_AVAILABLE_IN_ALL
void g_thread_init_glib (void);
void g_thread_init_glib (void) { }
@@ -351,10 +352,11 @@ g_thread_create (GThreadFunc func,
* @bound: ignored
* @priority: ignored
* @error: return location for error.
- * @Returns: the new #GThread on success.
*
* This function creates a new thread.
*
+ * Returns: the new #GThread on success.
+ *
* Deprecated:2.32: The @bound and @priority arguments are now ignored.
* Use g_thread_new().
*/
@@ -372,7 +374,7 @@ g_thread_create_full (GThreadFunc func,
thread = g_thread_new_internal (NULL, g_deprecated_thread_proxy,
func, data, stack_size, error);
- if (!joinable)
+ if (thread && !joinable)
{
thread->joinable = FALSE;
g_thread_unref (thread);
@@ -501,12 +503,13 @@ g_static_mutex_init (GStaticMutex *mutex)
/**
* g_static_mutex_get_mutex:
* @mutex: a #GStaticMutex.
- * @Returns: the #GMutex corresponding to @mutex.
*
* 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.
*
+ * Returns: the #GMutex corresponding to @mutex.
+ *
* Deprecated: 2.32: Just use a #GMutex
*/
GMutex *
@@ -556,10 +559,11 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex)
/**
* g_static_mutex_trylock:
* @mutex: a #GStaticMutex.
- * @Returns: %TRUE, if the #GStaticMutex could be locked.
*
* Works like g_mutex_trylock(), but for a #GStaticMutex.
*
+ * Returns: %TRUE, if the #GStaticMutex could be locked.
+ *
* Deprecated: 2.32: Use g_mutex_trylock()
*/
@@ -586,7 +590,7 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex)
* <note><para>Calling g_static_mutex_free() on a locked mutex may
* result in undefined behaviour.</para></note>
*
- * Deprecated: 2.32: Use g_mutex_free()
+ * Deprecated: 2.32: Use g_mutex_clear()
*/
void
g_static_mutex_free (GStaticMutex* mutex)
@@ -716,7 +720,6 @@ g_static_rec_mutex_lock (GStaticRecMutex* mutex)
/**
* g_static_rec_mutex_trylock:
* @mutex: a #GStaticRecMutex to lock.
- * @Returns: %TRUE, if @mutex could be locked.
*
* Tries to lock @mutex. If @mutex is already locked by another thread,
* it immediately returns %FALSE. Otherwise it locks @mutex and returns
@@ -724,6 +727,8 @@ g_static_rec_mutex_lock (GStaticRecMutex* mutex)
* functions increases the depth of @mutex and immediately returns
* %TRUE.
*
+ * Returns: %TRUE, if @mutex could be locked.
+ *
* Deprecated: 2.32: Use g_rec_mutex_trylock()
*/
gboolean
@@ -789,8 +794,6 @@ g_static_rec_mutex_lock_full (GStaticRecMutex *mutex,
/**
* g_static_rec_mutex_unlock_full:
* @mutex: a #GStaticRecMutex to completely unlock.
- * @Returns: number of times @mutex has been locked by the current
- * thread.
*
* Completely unlocks @mutex. If another thread is blocked in a
* g_static_rec_mutex_lock() call for @mutex, it will be woken and can
@@ -800,6 +803,9 @@ g_static_rec_mutex_lock_full (GStaticRecMutex *mutex,
* g_static_rec_mutex_lock_full() with the depth returned by this
* function.
*
+ * Returns: number of times @mutex has been locked by the current
+ * thread.
+ *
* Deprecated: 2.32: Use g_rec_mutex_unlock()
*/
guint
@@ -1024,7 +1030,6 @@ g_static_rw_lock_reader_lock (GStaticRWLock* lock)
/**
* g_static_rw_lock_reader_trylock:
* @lock: a #GStaticRWLock to lock for reading.
- * @Returns: %TRUE, if @lock could be locked for reading.
*
* Tries to lock @lock for reading. If @lock is already locked for
* writing by another thread or if another thread is already waiting to
@@ -1032,6 +1037,8 @@ g_static_rw_lock_reader_lock (GStaticRWLock* lock)
* @lock for reading and returns %TRUE. This lock has to be unlocked by
* g_static_rw_lock_reader_unlock().
*
+ * Returns: %TRUE, if @lock could be locked for reading.
+ *
* Deprectated: 2.32: Use g_rw_lock_reader_trylock() instead
*/
gboolean
@@ -1113,13 +1120,14 @@ g_static_rw_lock_writer_lock (GStaticRWLock* lock)
/**
* g_static_rw_lock_writer_trylock:
* @lock: a #GStaticRWLock to lock for writing.
- * @Returns: %TRUE, if @lock could be locked for writing.
*
* 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().
*
+ * Returns: %TRUE, if @lock could be locked for writing.
+ *
* Deprectated: 2.32: Use g_rw_lock_writer_trylock() instead
*/
gboolean
@@ -1461,7 +1469,7 @@ g_static_private_free (GStaticPrivate *private_key)
*
* Returns: a newly allocated #GMutex. Use g_mutex_free() to free
*
- * Deprecated:3.32:GMutex can now be statically allocated, or embedded
+ * Deprecated: 2.32: GMutex can now be statically allocated, or embedded
* in structures and initialised with g_mutex_init().
*/
GMutex *
@@ -1484,7 +1492,7 @@ g_mutex_new (void)
* Calling g_mutex_free() on a locked mutex may result
* in undefined behaviour.
*
- * Deprecated:3.32:GMutex can now be statically allocated, or embedded
+ * Deprecated: 2.32: GMutex can now be statically allocated, or embedded
* in structures and initialised with g_mutex_init().
*/
void
@@ -1503,7 +1511,7 @@ g_mutex_free (GMutex *mutex)
*
* Returns: a newly allocated #GCond. Free with g_cond_free()
*
- * Deprecated:3.32:GCond can now be statically allocated, or embedded
+ * Deprecated: 2.32: GCond can now be statically allocated, or embedded
* in structures and initialised with g_cond_init().
*/
GCond *
@@ -1526,7 +1534,7 @@ g_cond_new (void)
* Calling g_cond_free() for a #GCond on which threads are
* blocking leads to undefined behaviour.
*
- * Deprecated:3.32:GCond can now be statically allocated, or embedded
+ * Deprecated: 2.32: GCond can now be statically allocated, or embedded
* in structures and initialised with g_cond_init().
*/
void
diff --git a/glib/glib/deprecated/gthread.h b/glib/glib/deprecated/gthread.h
index 1866540..462bb8f 100644
--- a/glib/glib/deprecated/gthread.h
+++ b/glib/glib/deprecated/gthread.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_DEPRECATED_THREAD_H__
+#define __G_DEPRECATED_THREAD_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DEPRECATED_THREAD_H__
-#define __G_DEPRECATED_THREAD_H__
-
#include <glib/gthread.h>
G_BEGIN_DECLS
@@ -143,8 +143,9 @@ typedef struct
GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_init)
void g_static_mutex_init (GStaticMutex *mutex);
-GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_free)
+GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_clear)
void g_static_mutex_free (GStaticMutex *mutex);
+GLIB_DEPRECATED_IN_2_32_FOR(GMutex)
GMutex *g_static_mutex_get_mutex_impl (GStaticMutex *mutex);
typedef struct _GStaticRecMutex GStaticRecMutex;
diff --git a/glib/glib/docs.c b/glib/glib/docs.c
index a3d862c..c7ae282 100644
--- a/glib/glib/docs.c
+++ b/glib/glib/docs.c
@@ -1895,7 +1895,11 @@
* 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.
+ * except its return value.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* <note><para>
* A function that has pointer arguments and examines the data pointed to
@@ -1912,8 +1916,11 @@
* 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.
+ * the parameters and/or global variables.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*/
/**
@@ -1924,7 +1931,11 @@
* 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.
+ * allocated memory).
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.6
*/
@@ -1937,7 +1948,11 @@
* if the compiler is a new enough <command>gcc</command>. This attribute
* tells the compiler that the function returns a pointer to memory of a
* size that is specified by the @x<!-- -->th function parameter.
- * See the GNU C documentation for details.
+ *
+ * Place the attribute after the function declaration, just before the
+ * semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.18
*/
@@ -1951,7 +1966,11 @@
* if the compiler is a new enough <command>gcc</command>. This attribute
* tells the compiler that the function returns a pointer to memory of a
* size that is specified by the product of two function parameters.
- * See the GNU C documentation for details.
+ *
+ * Place the attribute after the function declaration, just before the
+ * semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.18
*/
@@ -1964,7 +1983,10 @@
* variables and functions as deprecated. When called with the
* <option>-Wdeprecated-declarations</option> option, the compiler will
* generate warnings when deprecated interfaces are used.
- * See the GNU C documentation for details.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.2
*/
@@ -1977,7 +1999,10 @@
* Like %G_GNUC_DEPRECATED, but names the intended replacement for the
* deprecated symbol if the version of <command>gcc</command> in use is
* new enough to support custom deprecation messages.
- * See the GNU C documentation for details.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Note that if @f is a macro, it will be expanded in the warning message.
* You can enclose it in quotes to prevent this. (The quotes will show up
@@ -2032,6 +2057,7 @@
/**
* G_DEPRECATED_FOR:
+ * @f: the name of the function that this function was deprecated for
*
* This macro is similar to %G_GNUC_DEPRECATED_FOR, and can be used to mark
* functions declarations as deprecated. Unlike %G_GNUC_DEPRECATED_FOR, it is
@@ -2043,6 +2069,8 @@
/**
* G_UNAVAILABLE:
+ * @maj: the major version that introduced the symbol
+ * @min: the minor version that introduced the symbol
*
* This macro can be used to mark a function declaration as unavailable.
* It must be placed before the function declaration. Use of a function
@@ -2065,8 +2093,11 @@
* 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.
+ * and avoids possible compiler warnings.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*/
/**
@@ -2074,8 +2105,19 @@
*
* 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.
+ * functions and arguments which may never be used. It avoids possible compiler
+ * warnings.
+ *
+ * For functions, place the attribute after the declaration, just before the
+ * semicolon. For arguments, place the attribute at the beginning of the
+ * argument declaration.
+ *
+ * |[
+ * void my_unused_function (G_GNUC_UNUSED gint unused_argument,
+ * gint other_argument) G_GNUC_UNUSED;
+ * ]|
+ *
+ * See the GNU C documentation for more details.
*/
/**
@@ -2088,7 +2130,12 @@
* 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 printf(). It allows the compiler to type-check the arguments
- * passed to the function. See the GNU C documentation for details.
+ * passed to the function.
+ *
+ * Place the attribute after the function declaration, just before the
+ * semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* |[
* gint g_snprintf (gchar *string,
@@ -2122,7 +2169,12 @@
* so that the result can be passed to a printf(), scanf(), strftime()
* or strfmon() 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.
+ * string).
+ *
+ * Place the attribute after the function declaration, just before the
+ * semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* |[
* gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2);
@@ -2136,7 +2188,11 @@
* 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.
+ * explicit %NULL.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.8
*/
@@ -2147,7 +2203,11 @@
* Expands to the GNU C <literal>warn_unused_result</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.
+ * of a function call is ignored.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*
* Since: 2.10
*/
@@ -2179,7 +2239,10 @@
* 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.
+ *
+ * Place the attribute after the declaration, just before the semicolon.
+ *
+ * See the GNU C documentation for more details.
*/
/**
diff --git a/glib/glib/galloca.h b/glib/glib/galloca.h
index 1ecdf65..8ece1b2 100644
--- a/glib/glib/galloca.h
+++ b/glib/glib/galloca.h
@@ -24,16 +24,18 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_ALLOCA_H__
+#define __G_ALLOCA_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ALLOCA_H__
-#define __G_ALLOCA_H__
-
#include <glib/gtypes.h>
-#ifdef __GNUC__
+#if defined(__BIONIC__) && defined (GLIB_HAVE_ALLOCA_H)
+# include <alloca.h>
+#elif defined(__GNUC__)
/* GCC does the right thing */
# undef alloca
# define alloca(size) __builtin_alloca (size)
diff --git a/glib/glib/garray.c b/glib/glib/garray.c
index 0cb3713..3bfbe9d 100644
--- a/glib/glib/garray.c
+++ b/glib/glib/garray.c
@@ -118,7 +118,6 @@ struct _GRealArray
* @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.
*
* Returns the element of a #GArray at the given index. The return
* value is cast to the given type.
@@ -132,6 +131,8 @@ struct _GRealArray
* event = &amp;g_array_index (events, EDayViewEvent, 3);
* </programlisting>
* </example>
+ *
+ * Returns: the element of the #GArray at the index given by @i.
**/
#define g_array_elt_len(array,i) ((array)->elt_size * (i))
@@ -154,9 +155,10 @@ static void g_array_maybe_expand (GRealArray *array,
* @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.
*
* Creates a new #GArray with a reference count of 1.
+ *
+ * Returns: the new #GArray.
**/
GArray*
g_array_new (gboolean zero_terminated,
@@ -176,12 +178,13 @@ g_array_new (gboolean zero_terminated,
* allocation.
* @element_size: size of each element in the array.
* @reserved_size: number of elements preallocated.
- * @Returns: the new #GArray.
*
* Creates a new #GArray with @reserved_size elements preallocated and
* a reference count of 1. 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.
+ *
+ * Returns: the new #GArray.
**/
GArray* g_array_sized_new (gboolean zero_terminated,
gboolean clear,
@@ -315,8 +318,6 @@ g_array_get_element_size (GArray *array)
* g_array_free:
* @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. The element data should be freed using g_free().
*
* Frees the memory allocated for the #GArray. If @free_segment is
* %TRUE it frees the memory block holding the elements as well and
@@ -328,6 +329,9 @@ g_array_get_element_size (GArray *array)
*
* <note><para>If array elements contain dynamically-allocated memory,
* they should be freed separately.</para></note>
+ *
+ * Returns: the element data if @free_segment is %FALSE, otherwise
+ * %NULL. The element data should be freed using g_free().
**/
gchar*
g_array_free (GArray *farray,
@@ -388,15 +392,15 @@ array_free (GRealArray *array,
* @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.
*
* Adds @len elements onto the end of the array.
+ *
+ * Returns: the #GArray.
**/
/**
* g_array_append_val:
* @a: a #GArray.
* @v: the value to append to the #GArray.
- * @Returns: the #GArray.
*
* Adds the value on to the end of the array. The array will grow in
* size automatically if necessary.
@@ -404,6 +408,8 @@ array_free (GRealArray *array,
* <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>
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_append_vals (GArray *farray,
@@ -432,19 +438,19 @@ g_array_append_vals (GArray *farray,
* @data: a pointer to the elements to prepend to the start of the
* array.
* @len: the number of elements to prepend.
- * @Returns: the #GArray.
*
* Adds @len elements onto the start of the array.
*
* 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.
+ *
+ * Returns: the #GArray.
**/
/**
* g_array_prepend_val:
* @a: a #GArray.
* @v: the value to prepend to the #GArray.
- * @Returns: the #GArray.
*
* Adds the value on to the start of the array. The array will grow in
* size automatically if necessary.
@@ -456,6 +462,8 @@ g_array_append_vals (GArray *farray,
* <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>
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_prepend_vals (GArray *farray,
@@ -486,22 +494,24 @@ g_array_prepend_vals (GArray *farray,
* @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.
*
* Inserts @len elements into a #GArray at the given index.
+ *
+ * Returns: the #GArray.
**/
/**
* g_array_insert_val:
* @a: a #GArray.
* @i: the index to place the element at.
* @v: the value to insert into the array.
- * @Returns: the #GArray.
*
* Inserts an element into an array at the given index.
*
* <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>
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_insert_vals (GArray *farray,
@@ -532,10 +542,11 @@ g_array_insert_vals (GArray *farray,
* g_array_set_size:
* @array: a #GArray.
* @length: the new size of the #GArray.
- * @Returns: the #GArray.
*
* 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.
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_set_size (GArray *farray,
@@ -566,10 +577,11 @@ g_array_set_size (GArray *farray,
* g_array_remove_index:
* @array: a #GArray.
* @index_: the index of the element to remove.
- * @Returns: the #GArray.
*
* Removes the element at the given index from a #GArray. The following
* elements are moved down one place.
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_remove_index (GArray *farray,
@@ -603,12 +615,13 @@ g_array_remove_index (GArray *farray,
* g_array_remove_index_fast:
* @array: a @GArray.
* @index_: the index of the element to remove.
- * @Returns: the #GArray.
*
* 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().
+ *
+ * Returns: the #GArray.
**/
GArray*
g_array_remove_index_fast (GArray *farray,
@@ -643,11 +656,12 @@ g_array_remove_index_fast (GArray *farray,
* @array: a @GArray.
* @index_: the index of the first element to remove.
* @length: the number of elements to remove.
- * @Returns: the #GArray.
*
* Removes the given number of elements starting at the given index
* from a #GArray. The following elements are moved to close the gap.
*
+ * Returns: the #GArray.
+ *
* Since: 2.4
**/
GArray*
@@ -848,9 +862,10 @@ struct _GRealPtrArray
* g_ptr_array_index:
* @array: a #GPtrArray.
* @index_: the index of the pointer to return.
- * @Returns: the pointer at the given index.
*
* Returns the pointer at the given index of the pointer array.
+ *
+ * Returns: the pointer at the given index.
**/
static void g_ptr_array_maybe_expand (GRealPtrArray *array,
@@ -858,9 +873,10 @@ static void g_ptr_array_maybe_expand (GRealPtrArray *array,
/**
* g_ptr_array_new:
- * @Returns: the new #GPtrArray.
*
* Creates a new #GPtrArray with a reference count of 1.
+ *
+ * Returns: the new #GPtrArray.
**/
GPtrArray*
g_ptr_array_new (void)
@@ -871,12 +887,13 @@ g_ptr_array_new (void)
/**
* g_ptr_array_sized_new:
* @reserved_size: number of pointers preallocated.
- * @Returns: the new #GPtrArray.
*
* Creates a new #GPtrArray with @reserved_size pointers preallocated
* and a reference count of 1. 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.
+ *
+ * Returns: the new #GPtrArray.
**/
GPtrArray*
g_ptr_array_sized_new (guint reserved_size)
@@ -970,15 +987,15 @@ g_ptr_array_set_free_func (GPtrArray *array,
/**
* g_ptr_array_ref:
- * @array: A #GArray.
+ * @array: a #GPtrArray
*
- * Atomically increments the reference count of @array by one. This
- * function is MT-safe and may be called from any thread.
+ * Atomically increments the reference count of @array by one.
+ * This function is thread-safe and may be called from any thread.
*
- * Returns: The passed in #GPtrArray.
+ * Returns: The passed in #GPtrArray
*
* Since: 2.22
- **/
+ */
GPtrArray *
g_ptr_array_ref (GPtrArray *array)
{
@@ -1018,8 +1035,6 @@ g_ptr_array_unref (GPtrArray *array)
* g_ptr_array_free:
* @array: a #GPtrArray.
* @free_seg: if %TRUE the actual pointer array is freed as well.
- * @Returns: the pointer array if @free_seg is %FALSE, otherwise %NULL.
- * The pointer array should be freed using g_free().
*
* Frees the memory allocated for the #GPtrArray. If @free_seg is %TRUE
* it frees the memory block holding the elements as well. Pass %FALSE
@@ -1031,6 +1046,9 @@ g_ptr_array_unref (GPtrArray *array)
* <note><para>If array contents point to dynamically-allocated
* memory, they should be freed separately if @free_seg is %TRUE and no
* #GDestroyNotify function has been set for @array.</para></note>
+ *
+ * Returns: the pointer array if @free_seg is %FALSE, otherwise %NULL.
+ * The pointer array should be freed using g_free().
**/
gpointer*
g_ptr_array_free (GPtrArray *farray,
@@ -1138,12 +1156,13 @@ g_ptr_array_set_size (GPtrArray *farray,
* g_ptr_array_remove_index:
* @array: a #GPtrArray.
* @index_: the index of the pointer to remove.
- * @Returns: the pointer which was removed.
*
* Removes the pointer at the given index from the pointer array. The
* following elements are moved down one place. If @array has a
* non-%NULL #GDestroyNotify function it is called for the removed
* element.
+ *
+ * Returns: the pointer which was removed.
**/
gpointer
g_ptr_array_remove_index (GPtrArray *farray,
@@ -1177,13 +1196,14 @@ g_ptr_array_remove_index (GPtrArray *farray,
* g_ptr_array_remove_index_fast:
* @array: a #GPtrArray.
* @index_: the index of the pointer to remove.
- * @Returns: the pointer which was removed.
*
* 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(). If @array has a non-%NULL
* #GDestroyNotify function it is called for the removed element.
+ *
+ * Returns: the pointer which was removed.
**/
gpointer
g_ptr_array_remove_index_fast (GPtrArray *farray,
@@ -1263,8 +1283,6 @@ g_ptr_array_remove_range (GPtrArray *farray,
* g_ptr_array_remove:
* @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.
*
* Removes the first occurrence of the given pointer from the pointer
* array. The following elements are moved down one place. If @array
@@ -1273,6 +1291,9 @@ g_ptr_array_remove_range (GPtrArray *farray,
*
* It returns %TRUE if the pointer was removed, or %FALSE if the
* pointer was not found.
+ *
+ * Returns: %TRUE if the pointer is removed. %FALSE if the pointer is
+ * not found in the array.
**/
gboolean
g_ptr_array_remove (GPtrArray *farray,
@@ -1299,7 +1320,6 @@ g_ptr_array_remove (GPtrArray *farray,
* g_ptr_array_remove_fast:
* @array: a #GPtrArray.
* @data: the pointer to remove.
- * @Returns: %TRUE if the pointer was found in the array.
*
* 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,
@@ -1309,6 +1329,8 @@ g_ptr_array_remove (GPtrArray *farray,
*
* It returns %TRUE if the pointer was removed, or %FALSE if the
* pointer was not found.
+ *
+ * Returns: %TRUE if the pointer was found in the array.
**/
gboolean
g_ptr_array_remove_fast (GPtrArray *farray,
@@ -1487,9 +1509,10 @@ g_ptr_array_foreach (GPtrArray *array,
/**
* g_byte_array_new:
- * @Returns: the new #GByteArray.
*
* Creates a new #GByteArray with a reference count of 1.
+ *
+ * Returns: (transfer full): the new #GByteArray.
**/
GByteArray* g_byte_array_new (void)
{
@@ -1498,7 +1521,7 @@ GByteArray* g_byte_array_new (void)
/**
* g_byte_array_new_take:
- * @data: (array length=len): byte data for the array
+ * @data: (transfer full) (array length=len): byte data for the array
* @len: length of @data
*
* Create byte array containing the data. The data will be owned by the array
@@ -1529,12 +1552,13 @@ g_byte_array_new_take (guint8 *data,
/**
* g_byte_array_sized_new:
* @reserved_size: number of bytes preallocated.
- * @Returns: the new #GByteArray.
*
* 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.
+ *
+ * Returns: the new #GByteArray.
**/
GByteArray* g_byte_array_sized_new (guint reserved_size)
{
@@ -1545,13 +1569,14 @@ GByteArray* g_byte_array_sized_new (guint reserved_size)
* g_byte_array_free:
* @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. The element data should be freed using g_free().
*
* Frees the memory allocated by the #GByteArray. If @free_segment is
* %TRUE it frees the actual byte data. If the reference count of
* @array is greater than one, the #GByteArray wrapper is preserved but
* the size of @array will be set to zero.
+ *
+ * Returns: the element data if @free_segment is %FALSE, otherwise
+ * %NULL. The element data should be freed using g_free().
**/
guint8* g_byte_array_free (GByteArray *array,
gboolean free_segment)
@@ -1627,10 +1652,11 @@ g_byte_array_unref (GByteArray *array)
* @array: a #GByteArray.
* @data: the byte data to be added.
* @len: the number of bytes to add.
- * @Returns: the #GByteArray.
*
* Adds the given bytes to the end of the #GByteArray. The array will
* grow in size automatically if necessary.
+ *
+ * Returns: the #GByteArray.
**/
GByteArray* g_byte_array_append (GByteArray *array,
const guint8 *data,
@@ -1646,10 +1672,11 @@ GByteArray* g_byte_array_append (GByteArray *array,
* @array: a #GByteArray.
* @data: the byte data to be added.
* @len: the number of bytes to add.
- * @Returns: the #GByteArray.
*
* Adds the given data to the start of the #GByteArray. The array will
* grow in size automatically if necessary.
+ *
+ * Returns: the #GByteArray.
**/
GByteArray* g_byte_array_prepend (GByteArray *array,
const guint8 *data,
@@ -1664,9 +1691,10 @@ GByteArray* g_byte_array_prepend (GByteArray *array,
* g_byte_array_set_size:
* @array: a #GByteArray.
* @length: the new size of the #GByteArray.
- * @Returns: the #GByteArray.
*
* Sets the size of the #GByteArray, expanding it if necessary.
+ *
+ * Returns: the #GByteArray.
**/
GByteArray* g_byte_array_set_size (GByteArray *array,
guint length)
@@ -1680,10 +1708,11 @@ GByteArray* g_byte_array_set_size (GByteArray *array,
* g_byte_array_remove_index:
* @array: a #GByteArray.
* @index_: the index of the byte to remove.
- * @Returns: the #GByteArray.
*
* Removes the byte at the given index from a #GByteArray. The
* following bytes are moved down one place.
+ *
+ * Returns: the #GByteArray.
**/
GByteArray* g_byte_array_remove_index (GByteArray *array,
guint index_)
@@ -1697,12 +1726,13 @@ GByteArray* g_byte_array_remove_index (GByteArray *array,
* g_byte_array_remove_index_fast:
* @array: a #GByteArray.
* @index_: the index of the byte to remove.
- * @Returns: the #GByteArray.
*
* 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().
+ *
+ * Returns: the #GByteArray.
**/
GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
guint index_)
@@ -1717,11 +1747,12 @@ GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
* @array: a @GByteArray.
* @index_: the index of the first byte to remove.
* @length: the number of bytes to remove.
- * @Returns: the #GByteArray.
*
* Removes the given number of bytes starting at the given index from a
* #GByteArray. The following elements are moved to close the gap.
*
+ * Returns: the #GByteArray.
+ *
* Since: 2.4
**/
GByteArray*
diff --git a/glib/glib/garray.h b/glib/glib/garray.h
index eb37b92..f3d7cee 100644
--- a/glib/glib/garray.h
+++ b/glib/glib/garray.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_ARRAY_H__
+#define __G_ARRAY_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ARRAY_H__
-#define __G_ARRAY_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -68,42 +68,58 @@ struct _GPtrArray
#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1)
#define g_array_index(a,t,i) (((t*) (void *) (a)->data) [(i)])
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_new (gboolean zero_terminated,
gboolean clear_,
guint element_size);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_sized_new (gboolean zero_terminated,
gboolean clear_,
guint element_size,
guint reserved_size);
+GLIB_AVAILABLE_IN_ALL
gchar* g_array_free (GArray *array,
gboolean free_segment);
+GLIB_AVAILABLE_IN_ALL
GArray *g_array_ref (GArray *array);
+GLIB_AVAILABLE_IN_ALL
void g_array_unref (GArray *array);
+GLIB_AVAILABLE_IN_ALL
guint g_array_get_element_size (GArray *array);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_append_vals (GArray *array,
gconstpointer data,
guint len);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_prepend_vals (GArray *array,
gconstpointer data,
guint len);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_insert_vals (GArray *array,
guint index_,
gconstpointer data,
guint len);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_set_size (GArray *array,
guint length);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_remove_index (GArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_remove_index_fast (GArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
GArray* g_array_remove_range (GArray *array,
guint index_,
guint length);
+GLIB_AVAILABLE_IN_ALL
void g_array_sort (GArray *array,
GCompareFunc compare_func);
+GLIB_AVAILABLE_IN_ALL
void g_array_sort_with_data (GArray *array,
GCompareDataFunc compare_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_array_set_clear_func (GArray *array,
GDestroyNotify clear_func);
@@ -112,37 +128,55 @@ void g_array_set_clear_func (GArray *array,
* spot and shortens the array. remove_fast will again distort order.
*/
#define g_ptr_array_index(array,index_) ((array)->pdata)[index_]
+GLIB_AVAILABLE_IN_ALL
GPtrArray* g_ptr_array_new (void);
+GLIB_AVAILABLE_IN_ALL
GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func);
+GLIB_AVAILABLE_IN_ALL
GPtrArray* g_ptr_array_sized_new (guint reserved_size);
+GLIB_AVAILABLE_IN_ALL
GPtrArray* g_ptr_array_new_full (guint reserved_size,
GDestroyNotify element_free_func);
+GLIB_AVAILABLE_IN_ALL
gpointer* g_ptr_array_free (GPtrArray *array,
gboolean free_seg);
+GLIB_AVAILABLE_IN_ALL
GPtrArray* g_ptr_array_ref (GPtrArray *array);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_unref (GPtrArray *array);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_set_free_func (GPtrArray *array,
GDestroyNotify element_free_func);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_set_size (GPtrArray *array,
gint length);
+GLIB_AVAILABLE_IN_ALL
gpointer g_ptr_array_remove_index (GPtrArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
gpointer g_ptr_array_remove_index_fast (GPtrArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
gboolean g_ptr_array_remove (GPtrArray *array,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
gboolean g_ptr_array_remove_fast (GPtrArray *array,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_remove_range (GPtrArray *array,
guint index_,
guint length);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_add (GPtrArray *array,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_sort (GPtrArray *array,
GCompareFunc compare_func);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_sort_with_data (GPtrArray *array,
GCompareDataFunc compare_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_ptr_array_foreach (GPtrArray *array,
GFunc func,
gpointer user_data);
@@ -152,32 +186,47 @@ void g_ptr_array_foreach (GPtrArray *array,
* but type-safe.
*/
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_new (void);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_new_take (guint8 *data,
gsize len);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_sized_new (guint reserved_size);
+GLIB_AVAILABLE_IN_ALL
guint8* g_byte_array_free (GByteArray *array,
gboolean free_segment);
+GLIB_AVAILABLE_IN_ALL
GBytes* g_byte_array_free_to_bytes (GByteArray *array);
+GLIB_AVAILABLE_IN_ALL
GByteArray *g_byte_array_ref (GByteArray *array);
+GLIB_AVAILABLE_IN_ALL
void g_byte_array_unref (GByteArray *array);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_append (GByteArray *array,
const guint8 *data,
guint len);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_prepend (GByteArray *array,
const guint8 *data,
guint len);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_set_size (GByteArray *array,
guint length);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_remove_index (GByteArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
guint index_);
+GLIB_AVAILABLE_IN_ALL
GByteArray* g_byte_array_remove_range (GByteArray *array,
guint index_,
guint length);
+GLIB_AVAILABLE_IN_ALL
void g_byte_array_sort (GByteArray *array,
GCompareFunc compare_func);
+GLIB_AVAILABLE_IN_ALL
void g_byte_array_sort_with_data (GByteArray *array,
GCompareDataFunc compare_func,
gpointer user_data);
diff --git a/glib/glib/gasyncqueue.h b/glib/glib/gasyncqueue.h
index f0d6d95..3d4b38f 100644
--- a/glib/glib/gasyncqueue.h
+++ b/glib/glib/gasyncqueue.h
@@ -24,24 +24,30 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_ASYNCQUEUE_H__
+#define __G_ASYNCQUEUE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ASYNCQUEUE_H__
-#define __G_ASYNCQUEUE_H__
-
#include <glib/gthread.h>
G_BEGIN_DECLS
typedef struct _GAsyncQueue GAsyncQueue;
+GLIB_AVAILABLE_IN_ALL
GAsyncQueue *g_async_queue_new (void);
+GLIB_AVAILABLE_IN_ALL
GAsyncQueue *g_async_queue_new_full (GDestroyNotify item_free_func);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_lock (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_unlock (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GAsyncQueue *g_async_queue_ref (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_unref (GAsyncQueue *queue);
GLIB_DEPRECATED_FOR(g_async_queue_ref)
@@ -50,31 +56,45 @@ void g_async_queue_ref_unlocked (GAsyncQueue *queue);
GLIB_DEPRECATED_FOR(g_async_queue_unref)
void g_async_queue_unref_and_unlock (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_push (GAsyncQueue *queue,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_push_unlocked (GAsyncQueue *queue,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_push_sorted (GAsyncQueue *queue,
gpointer data,
GCompareDataFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue,
gpointer data,
GCompareDataFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_pop (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_try_pop (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_timeout_pop (GAsyncQueue *queue,
guint64 timeout);
+GLIB_AVAILABLE_IN_ALL
gpointer g_async_queue_timeout_pop_unlocked (GAsyncQueue *queue,
guint64 timeout);
+GLIB_AVAILABLE_IN_ALL
gint g_async_queue_length (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gint g_async_queue_length_unlocked (GAsyncQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_sort (GAsyncQueue *queue,
GCompareDataFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_async_queue_sort_unlocked (GAsyncQueue *queue,
GCompareDataFunc func,
gpointer user_data);
diff --git a/glib/glib/gatomic.c b/glib/glib/gatomic.c
index 2df2bcc..eb2fe46 100644
--- a/glib/glib/gatomic.c
+++ b/glib/glib/gatomic.c
@@ -111,7 +111,7 @@
* Since: 2.4
**/
gint
-(g_atomic_int_get) (volatile gint *atomic)
+(g_atomic_int_get) (const volatile gint *atomic)
{
return g_atomic_int_get (atomic);
}
@@ -316,9 +316,9 @@ guint
* Since: 2.4
**/
gpointer
-(g_atomic_pointer_get) (volatile void *atomic)
+(g_atomic_pointer_get) (const volatile void *atomic)
{
- return g_atomic_pointer_get ((volatile gpointer *) atomic);
+ return g_atomic_pointer_get ((const volatile gpointer *) atomic);
}
/**
@@ -467,17 +467,67 @@ gsize
#elif defined (G_PLATFORM_WIN32)
#include <windows.h>
-#if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64)
+#if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) && !(defined _MSC_VER && _MSC_VER <= 1200)
#define InterlockedAnd _InterlockedAnd
#define InterlockedOr _InterlockedOr
#define InterlockedXor _InterlockedXor
#endif
+#if !defined (_MSC_VER) || _MSC_VER <= 1200
+#include "gmessages.h"
+/* Inlined versions for older compiler */
+static LONG
+_gInterlockedAnd (volatile guint *atomic,
+ guint val)
+{
+ LONG i, j;
+
+ j = *atomic;
+ do {
+ i = j;
+ j = InterlockedCompareExchange(atomic, i & val, i);
+ } while (i != j);
+
+ return j;
+}
+#define InterlockedAnd(a,b) _gInterlockedAnd(a,b)
+static LONG
+_gInterlockedOr (volatile guint *atomic,
+ guint val)
+{
+ LONG i, j;
+
+ j = *atomic;
+ do {
+ i = j;
+ j = InterlockedCompareExchange(atomic, i | val, i);
+ } while (i != j);
+
+ return j;
+}
+#define InterlockedOr(a,b) _gInterlockedOr(a,b)
+static LONG
+_gInterlockedXor (volatile guint *atomic,
+ guint val)
+{
+ LONG i, j;
+
+ j = *atomic;
+ do {
+ i = j;
+ j = InterlockedCompareExchange(atomic, i ^ val, i);
+ } while (i != j);
+
+ return j;
+}
+#define InterlockedXor(a,b) _gInterlockedXor(a,b)
+#endif
+
/*
* http://msdn.microsoft.com/en-us/library/ms684122(v=vs.85).aspx
*/
gint
-(g_atomic_int_get) (volatile gint *atomic)
+(g_atomic_int_get) (const volatile gint *atomic)
{
MemoryBarrier ();
return *atomic;
@@ -541,9 +591,9 @@ guint
gpointer
-(g_atomic_pointer_get) (volatile void *atomic)
+(g_atomic_pointer_get) (const volatile void *atomic)
{
- volatile gpointer *ptr = atomic;
+ const volatile gpointer *ptr = atomic;
MemoryBarrier ();
return *ptr;
@@ -632,7 +682,7 @@ gsize
static pthread_mutex_t g_atomic_lock = PTHREAD_MUTEX_INITIALIZER;
gint
-(g_atomic_int_get) (volatile gint *atomic)
+(g_atomic_int_get) (const volatile gint *atomic)
{
gint value;
@@ -747,9 +797,9 @@ guint
gpointer
-(g_atomic_pointer_get) (volatile void *atomic)
+(g_atomic_pointer_get) (const volatile void *atomic)
{
- volatile gpointer *ptr = atomic;
+ const volatile gpointer *ptr = atomic;
gpointer value;
pthread_mutex_lock (&g_atomic_lock);
diff --git a/glib/glib/gatomic.h b/glib/glib/gatomic.h
index 8b52e0b..e7fd1f2 100644
--- a/glib/glib/gatomic.h
+++ b/glib/glib/gatomic.h
@@ -19,25 +19,31 @@
* Author: Ryan Lortie <desrt@desrt.ca>
*/
+#ifndef __G_ATOMIC_H__
+#define __G_ATOMIC_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ATOMIC_H__
-#define __G_ATOMIC_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
-gint g_atomic_int_get (volatile gint *atomic);
+GLIB_AVAILABLE_IN_ALL
+gint g_atomic_int_get (const volatile gint *atomic);
+GLIB_AVAILABLE_IN_ALL
void g_atomic_int_set (volatile gint *atomic,
gint newval);
+GLIB_AVAILABLE_IN_ALL
void g_atomic_int_inc (volatile gint *atomic);
+GLIB_AVAILABLE_IN_ALL
gboolean g_atomic_int_dec_and_test (volatile gint *atomic);
+GLIB_AVAILABLE_IN_ALL
gboolean g_atomic_int_compare_and_exchange (volatile gint *atomic,
gint oldval,
gint newval);
+GLIB_AVAILABLE_IN_ALL
gint g_atomic_int_add (volatile gint *atomic,
gint val);
GLIB_AVAILABLE_IN_2_30
@@ -46,15 +52,20 @@ guint g_atomic_int_and (volatile guint *a
GLIB_AVAILABLE_IN_2_30
guint g_atomic_int_or (volatile guint *atomic,
guint val);
+GLIB_AVAILABLE_IN_ALL
guint g_atomic_int_xor (volatile guint *atomic,
guint val);
-gpointer g_atomic_pointer_get (volatile void *atomic);
+GLIB_AVAILABLE_IN_ALL
+gpointer g_atomic_pointer_get (const volatile void *atomic);
+GLIB_AVAILABLE_IN_ALL
void g_atomic_pointer_set (volatile void *atomic,
gpointer newval);
+GLIB_AVAILABLE_IN_ALL
gboolean g_atomic_pointer_compare_and_exchange (volatile void *atomic,
gpointer oldval,
gpointer newval);
+GLIB_AVAILABLE_IN_ALL
gssize g_atomic_pointer_add (volatile void *atomic,
gssize val);
GLIB_AVAILABLE_IN_2_30
@@ -63,6 +74,7 @@ gsize g_atomic_pointer_and (volatile void *a
GLIB_AVAILABLE_IN_2_30
gsize g_atomic_pointer_or (volatile void *atomic,
gsize val);
+GLIB_AVAILABLE_IN_ALL
gsize g_atomic_pointer_xor (volatile void *atomic,
gsize val);
diff --git a/glib/glib/gbacktrace.c b/glib/glib/gbacktrace.c
index 957c482..4d19d6f 100644
--- a/glib/glib/gbacktrace.c
+++ b/glib/glib/gbacktrace.c
@@ -89,7 +89,8 @@
static void stack_trace (char **args);
#endif
-extern volatile gboolean glib_on_error_halt;
+/* People want to hit this from their debugger... */
+GLIB_AVAILABLE_IN_ALL volatile gboolean glib_on_error_halt;
volatile gboolean glib_on_error_halt = TRUE;
/**
diff --git a/glib/glib/gbacktrace.h b/glib/glib/gbacktrace.h
index f0a6eab..47dd2ee 100644
--- a/glib/glib/gbacktrace.h
+++ b/glib/glib/gbacktrace.h
@@ -24,19 +24,21 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_BACKTRACE_H__
+#define __G_BACKTRACE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_BACKTRACE_H__
-#define __G_BACKTRACE_H__
-
#include <glib/gtypes.h>
#include <signal.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
void g_on_error_query (const gchar *prg_name);
+GLIB_AVAILABLE_IN_ALL
void g_on_error_stack_trace (const gchar *prg_name);
/**
diff --git a/glib/glib/gbase64.c b/glib/glib/gbase64.c
index d0ab0ea..cc6cbfc 100644
--- a/glib/glib/gbase64.c
+++ b/glib/glib/gbase64.c
@@ -344,8 +344,18 @@ g_base64_decode_step (const gchar *in,
/* convert 4 base64 bytes to 3 normal bytes */
v=*save;
i=*state;
- inptr = (const guchar *)in;
+
last[0] = last[1] = 0;
+
+ /* we use the sign in the state to determine if we got a padding character
+ in the previous sequence */
+ if (i < 0)
+ {
+ i = -i;
+ last[0] = '=';
+ }
+
+ inptr = (const guchar *)in;
while (inptr < inend)
{
c = *inptr++;
@@ -369,7 +379,7 @@ g_base64_decode_step (const gchar *in,
}
*save = v;
- *state = i;
+ *state = last[0] == '=' ? -i : i;
return outptr - out;
}
@@ -379,7 +389,9 @@ g_base64_decode_step (const gchar *in,
* @text: zero-terminated string with base64 text to decode
* @out_len: (out): The length of the decoded data is written here
*
- * Decode a sequence of Base-64 encoded text into binary data
+ * Decode a sequence of Base-64 encoded text into binary data. Note
+ * that the returned binary data is not necessarily zero-terminated,
+ * so it should not be used as a character string.
*
* Return value: (transfer full) (array length=out_len) (element-type guint8):
* newly allocated buffer containing the binary data
diff --git a/glib/glib/gbase64.h b/glib/glib/gbase64.h
index 88ce6d8..b53fca5 100644
--- a/glib/glib/gbase64.h
+++ b/glib/glib/gbase64.h
@@ -18,36 +18,42 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_BASE64_H__
+#define __G_BASE64_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_BASE64_H__
-#define __G_BASE64_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
gsize g_base64_encode_step (const guchar *in,
gsize len,
gboolean break_lines,
gchar *out,
gint *state,
gint *save);
+GLIB_AVAILABLE_IN_ALL
gsize g_base64_encode_close (gboolean break_lines,
gchar *out,
gint *state,
gint *save);
+GLIB_AVAILABLE_IN_ALL
gchar* g_base64_encode (const guchar *data,
gsize len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gsize g_base64_decode_step (const gchar *in,
gsize len,
guchar *out,
gint *state,
guint *save);
+GLIB_AVAILABLE_IN_ALL
guchar *g_base64_decode (const gchar *text,
gsize *out_len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
guchar *g_base64_decode_inplace (gchar *text,
gsize *out_len);
diff --git a/glib/glib/gbitlock.c b/glib/glib/gbitlock.c
index 7b879be..e183d39 100644
--- a/glib/glib/gbitlock.c
+++ b/glib/glib/gbitlock.c
@@ -20,6 +20,8 @@
* Author: Ryan Lortie <desrt@desrt.ca>
*/
+#include "config.h"
+
#include "gbitlock.h"
#include <glib/gmessages.h>
@@ -29,10 +31,9 @@
#include <glib/gslice.h>
#include "gthreadprivate.h"
-#include "config.h"
-#undef HAVE_FUTEX
#ifdef G_BIT_LOCK_FORCE_FUTEX_EMULATION
+#undef HAVE_FUTEX
#endif
#ifndef HAVE_FUTEX
diff --git a/glib/glib/gbitlock.h b/glib/glib/gbitlock.h
index 641ee69..7485dfa 100644
--- a/glib/glib/gbitlock.h
+++ b/glib/glib/gbitlock.h
@@ -31,17 +31,23 @@
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
void g_bit_lock (volatile gint *address,
gint lock_bit);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bit_trylock (volatile gint *address,
gint lock_bit);
+GLIB_AVAILABLE_IN_ALL
void g_bit_unlock (volatile gint *address,
gint lock_bit);
+GLIB_AVAILABLE_IN_ALL
void g_pointer_bit_lock (volatile void *address,
gint lock_bit);
+GLIB_AVAILABLE_IN_ALL
gboolean g_pointer_bit_trylock (volatile void *address,
gint lock_bit);
+GLIB_AVAILABLE_IN_ALL
void g_pointer_bit_unlock (volatile void *address,
gint lock_bit);
diff --git a/glib/glib/gbookmarkfile.c b/glib/glib/gbookmarkfile.c
index edf196b..569d438 100644
--- a/glib/glib/gbookmarkfile.c
+++ b/glib/glib/gbookmarkfile.c
@@ -1585,15 +1585,7 @@ timestamp_from_iso8601 (const gchar *iso_date)
return (time_t) stamp.tv_sec;
}
-
-
-GQuark
-g_bookmark_file_error_quark (void)
-{
- return g_quark_from_static_string ("g-bookmark-file-error-quark");
-}
-
-
+G_DEFINE_QUARK (g-bookmark-file-error-quark, g_bookmark_file_error)
/********************
* Public API *
@@ -1897,7 +1889,7 @@ g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
/**
* g_bookmark_file_to_data:
* @bookmark: a #GBookmarkFile
- * @length: (allow-none): return location for the length of the returned string, or %NULL
+ * @length: (allow-none) (out): 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.
@@ -2087,13 +2079,13 @@ g_bookmark_file_has_item (GBookmarkFile *bookmark,
/**
* g_bookmark_file_get_uris:
* @bookmark: a #GBookmarkFile
- * @length: (allow-none): return location for the number of returned URIs, or %NULL
+ * @length: (allow-none) (out): 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.
+ * Return value: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings.
* Use g_strfreev() to free it.
*
* Since: 2.12
@@ -2922,7 +2914,7 @@ g_bookmark_file_set_groups (GBookmarkFile *bookmark,
* g_bookmark_file_get_groups:
* @bookmark: a #GBookmarkFile
* @uri: a valid URI
- * @length: (allow-none): return location for the length of the returned string, or %NULL
+ * @length: (allow-none) (out): 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.
@@ -2933,7 +2925,7 @@ g_bookmark_file_set_groups (GBookmarkFile *bookmark,
* The returned array is %NULL terminated, so @length may optionally
* be %NULL.
*
- * Return value: a newly allocated %NULL-terminated array of group names.
+ * Return value: (array length=length) (transfer full): a newly allocated %NULL-terminated array of group names.
* Use g_strfreev() to free it.
*
* Since: 2.12
@@ -3234,6 +3226,9 @@ g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
}
}
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
ai = bookmark_item_lookup_app_info (item, name);
if (!ai)
{
@@ -3344,9 +3339,9 @@ expand_exec_line (const gchar *exec_fmt,
* @bookmark: a #GBookmarkFile
* @uri: a valid URI
* @name: an application's name
- * @exec: (allow-none): location for the command line of the application, or %NULL
- * @count: (allow-none): return location for the registration count, or %NULL
- * @stamp: (allow-none): return location for the last registration time, or %NULL
+ * @exec: (allow-none) (out): return location for the command line of the application, or %NULL
+ * @count: (allow-none) (out): return location for the registration count, or %NULL
+ * @stamp: (allow-none) (out): 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
@@ -3444,7 +3439,7 @@ g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
* g_bookmark_file_get_applications:
* @bookmark: a #GBookmarkFile
* @uri: a valid URI
- * @length: (allow-none): return location of the length of the returned list, or %NULL
+ * @length: (allow-none) (out): 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
@@ -3453,7 +3448,7 @@ g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
* 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.
+ * Return value: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings.
* Use g_strfreev() to free it.
*
* Since: 2.12
@@ -3664,8 +3659,8 @@ g_bookmark_file_set_icon (GBookmarkFile *bookmark,
* g_bookmark_file_get_icon:
* @bookmark: a #GBookmarkFile
* @uri: a valid URI
- * @href: (allow-none): return location for the icon's location or %NULL
- * @mime_type: (allow-none): return location for the icon's MIME type or %NULL
+ * @href: (allow-none) (out): return location for the icon's location or %NULL
+ * @mime_type: (allow-none) (out): 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.
diff --git a/glib/glib/gbookmarkfile.h b/glib/glib/gbookmarkfile.h
index 6b2ee6f..4d94efe 100644
--- a/glib/glib/gbookmarkfile.h
+++ b/glib/glib/gbookmarkfile.h
@@ -17,13 +17,13 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
*/
+#ifndef __G_BOOKMARK_FILE_H__
+#define __G_BOOKMARK_FILE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_BOOKMARK_FILE_H__
-#define __G_BOOKMARK_FILE_H__
-
#include <glib/gerror.h>
#include <time.h>
@@ -66,6 +66,7 @@ typedef enum
G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND
} GBookmarkFileError;
+GLIB_AVAILABLE_IN_ALL
GQuark g_bookmark_file_error_quark (void);
/**
@@ -76,72 +77,93 @@ GQuark g_bookmark_file_error_quark (void);
*/
typedef struct _GBookmarkFile GBookmarkFile;
+GLIB_AVAILABLE_IN_ALL
GBookmarkFile *g_bookmark_file_new (void);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_free (GBookmarkFile *bookmark);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark,
const gchar *filename,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark,
const gchar *data,
gsize length,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
const gchar *file,
gchar **full_path,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark,
const gchar *filename,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_title (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *title);
+GLIB_AVAILABLE_IN_ALL
gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark,
const gchar *uri,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_description (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *description);
+GLIB_AVAILABLE_IN_ALL
gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark,
const gchar *uri,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *mime_type);
+GLIB_AVAILABLE_IN_ALL
gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark,
const gchar *uri,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_groups (GBookmarkFile *bookmark,
const gchar *uri,
const gchar **groups,
gsize length);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_add_group (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *group);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *group,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark,
const gchar *uri,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_add_application (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *name,
const gchar *exec);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *name,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark,
const gchar *uri,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *name,
@@ -149,6 +171,7 @@ gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
gint count,
time_t stamp,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *name,
@@ -156,55 +179,72 @@ gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
guint *count,
time_t *stamp,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_is_private (GBookmarkFile *bookmark,
const gchar *uri,
gboolean is_private);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark,
const gchar *uri,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_icon (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *href,
const gchar *mime_type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark,
const gchar *uri,
gchar **href,
gchar **mime_type,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_added (GBookmarkFile *bookmark,
const gchar *uri,
time_t added);
+GLIB_AVAILABLE_IN_ALL
time_t g_bookmark_file_get_added (GBookmarkFile *bookmark,
const gchar *uri,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_modified (GBookmarkFile *bookmark,
const gchar *uri,
time_t modified);
+GLIB_AVAILABLE_IN_ALL
time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark,
const gchar *uri,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_bookmark_file_set_visited (GBookmarkFile *bookmark,
const gchar *uri,
time_t visited);
+GLIB_AVAILABLE_IN_ALL
time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark,
const gchar *uri,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark,
const gchar *uri);
+GLIB_AVAILABLE_IN_ALL
gint g_bookmark_file_get_size (GBookmarkFile *bookmark);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark,
gsize *length) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *group,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark,
const gchar *uri,
const gchar *name,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark,
const gchar *uri,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bookmark_file_move_item (GBookmarkFile *bookmark,
const gchar *old_uri,
const gchar *new_uri,
diff --git a/glib/glib/gbytes.c b/glib/glib/gbytes.c
index daf5642..4d1f6c6 100644
--- a/glib/glib/gbytes.c
+++ b/glib/glib/gbytes.c
@@ -77,7 +77,8 @@ struct _GBytes
/**
* g_bytes_new:
- * @data: (array length=size): the data to be used for the bytes
+ * @data: (transfer none) (array length=size) (element-type guint8):
+ * the data to be used for the bytes
* @size: the size of @data
*
* Creates a new #GBytes from @data.
@@ -97,7 +98,8 @@ g_bytes_new (gconstpointer data,
/**
* g_bytes_new_take:
- * @data: (transfer full) (array length=size): the data to be used for the bytes
+ * @data: (transfer full) (array length=size) (element-type guint8):
+ the data to be used for the bytes
* @size: the size of @data
*
* Creates a new #GBytes from @data.
@@ -124,8 +126,9 @@ g_bytes_new_take (gpointer data,
/**
- * g_bytes_new_static:
- * @data: (array length=size): the data to be used for the bytes
+ * g_bytes_new_static: (skip)
+ * @data: (transfer full) (array length=size) (element-type guint8):
+ the data to be used for the bytes
* @size: the size of @data
*
* Creates a new #GBytes from static data.
@@ -218,7 +221,8 @@ g_bytes_new_from_bytes (GBytes *bytes,
*
* This function will always return the same pointer for a given #GBytes.
*
- * Returns: (array length=size) (type guint8): a pointer to the byte data
+ * Returns: (transfer none) (array length=size) (type guint8): a pointer to the
+ * byte data
*
* Since: 2.32
*/
@@ -390,7 +394,7 @@ try_steal_and_unref (GBytes *bytes,
{
gpointer result;
- if (bytes->free_func != free_func)
+ if (bytes->free_func != free_func || bytes->data == NULL)
return NULL;
/* Are we the only reference? */
diff --git a/glib/glib/gbytes.h b/glib/glib/gbytes.h
index de3c8f8..c89f6eb 100644
--- a/glib/glib/gbytes.h
+++ b/glib/glib/gbytes.h
@@ -21,55 +21,69 @@
* Stef Walter <stefw@collabora.co.uk>
*/
+#ifndef __G_BYTES_H__
+#define __G_BYTES_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_BYTES_H__
-#define __G_BYTES_H__
-
#include <glib/gtypes.h>
#include <glib/garray.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_new (gconstpointer data,
gsize size);
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_new_take (gpointer data,
gsize size);
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_new_static (gconstpointer data,
gsize size);
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_new_with_free_func (gconstpointer data,
gsize size,
GDestroyNotify free_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_new_from_bytes (GBytes *bytes,
gsize offset,
gsize length);
+GLIB_AVAILABLE_IN_ALL
gconstpointer g_bytes_get_data (GBytes *bytes,
gsize *size);
+GLIB_AVAILABLE_IN_ALL
gsize g_bytes_get_size (GBytes *bytes);
+GLIB_AVAILABLE_IN_ALL
GBytes * g_bytes_ref (GBytes *bytes);
+GLIB_AVAILABLE_IN_ALL
void g_bytes_unref (GBytes *bytes);
+GLIB_AVAILABLE_IN_ALL
gpointer g_bytes_unref_to_data (GBytes *bytes,
gsize *size);
+GLIB_AVAILABLE_IN_ALL
GByteArray * g_bytes_unref_to_array (GBytes *bytes);
+GLIB_AVAILABLE_IN_ALL
guint g_bytes_hash (gconstpointer bytes);
+GLIB_AVAILABLE_IN_ALL
gboolean g_bytes_equal (gconstpointer bytes1,
gconstpointer bytes2);
+GLIB_AVAILABLE_IN_ALL
gint g_bytes_compare (gconstpointer bytes1,
gconstpointer bytes2);
diff --git a/glib/glib/gcharset.c b/glib/glib/gcharset.c
index 4f52ab4..bb8c044 100644
--- a/glib/glib/gcharset.c
+++ b/glib/glib/gcharset.c
@@ -20,7 +20,7 @@
#include "config.h"
-#include "gcharset.h"
+#include "gcharsetprivate.h"
#include "garray.h"
#include "genviron.h"
@@ -87,7 +87,7 @@ get_alias_hash (void)
/* 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 **
+const char **
_g_charset_get_aliases (const char *canonical_name)
{
GHashTable *alias_hash = get_alias_hash ();
@@ -471,15 +471,15 @@ guess_category_value (const gchar *category_name)
{
const gchar *retval;
- /* The highest priority value is the `LANGUAGE' environment
+ /* 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. */
+ /* '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");
diff --git a/glib/glib/gcharset.h b/glib/glib/gcharset.h
index 9b56524..f3b306d 100644
--- a/glib/glib/gcharset.h
+++ b/glib/glib/gcharset.h
@@ -18,21 +18,25 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_CHARSET_H__
+#define __G_CHARSET_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_CHARSET_H__
-#define __G_CHARSET_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
gboolean g_get_charset (const char **charset);
+GLIB_AVAILABLE_IN_ALL
gchar * g_get_codeset (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * const * g_get_language_names (void);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_get_locale_variants (const gchar *locale);
G_END_DECLS
diff --git a/glib/glib/gcharsetprivate.h b/glib/glib/gcharsetprivate.h
new file mode 100644
index 0000000..aea1384
--- /dev/null
+++ b/glib/glib/gcharsetprivate.h
@@ -0,0 +1,32 @@
+/* gunicodeprivate.h
+ *
+ * Copyright (C) 2012 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_CHARSET_PRIVATE_H__
+#define __G_CHARSET_PRIVATE_H__
+
+#include "gcharset.h"
+
+G_BEGIN_DECLS
+
+const char ** _g_charset_get_aliases (const char *canonical_name);
+
+G_END_DECLS
+
+#endif
diff --git a/glib/glib/gchecksum.c b/glib/glib/gchecksum.c
index f543d96..4dc8558 100644
--- a/glib/glib/gchecksum.c
+++ b/glib/glib/gchecksum.c
@@ -54,7 +54,7 @@
* Support for checksums has been added in GLib 2.16
**/
-#define IS_VALID_TYPE(type) ((type) >= G_CHECKSUM_MD5 && (type) <= G_CHECKSUM_SHA256)
+#define IS_VALID_TYPE(type) ((type) >= G_CHECKSUM_MD5 && (type) <= G_CHECKSUM_SHA512)
/* The fact that these are lower case characters is part of the ABI */
static const gchar hex_digits[] = "0123456789abcdef";
@@ -102,6 +102,21 @@ typedef struct
guchar digest[SHA256_DIGEST_LEN];
} Sha256sum;
+#define SHA512_BLOCK_LEN 128 /* 1024 bits message block */
+#define SHA512_DIGEST_LEN 64
+
+typedef struct
+{
+ guint64 H[8];
+
+ guint8 block[SHA512_BLOCK_LEN];
+ guint8 block_len;
+
+ guint64 data_len[2];
+
+ guchar digest[SHA512_DIGEST_LEN];
+} Sha512sum;
+
struct _GChecksum
{
GChecksumType type;
@@ -112,6 +127,7 @@ struct _GChecksum
Md5sum md5;
Sha1sum sha1;
Sha256sum sha256;
+ Sha512sum sha512;
} sum;
};
@@ -1069,6 +1085,284 @@ sha256_sum_digest (Sha256sum *sha256,
digest[i] = sha256->digest[i];
}
+/*
+ * SHA-512 Checksum
+ *
+ * Implemented following FIPS-180-2 standard at
+ * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf.
+ * References in the form [§x.y.z] map to sections in that document.
+ *
+ * Author: Eduardo Lima Mitev <elima@igalia.com>
+ */
+
+/* SHA-384 and SHA-512 functions [§4.1.3] */
+#define Ch(x,y,z) ((x & y) ^ (~x & z))
+#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
+#define SHR(n,x) (x >> n)
+#define ROTR(n,x) (SHR (n, x) | (x << (64 - n)))
+#define SIGMA0(x) (ROTR (28, x) ^ ROTR (34, x) ^ ROTR (39, x))
+#define SIGMA1(x) (ROTR (14, x) ^ ROTR (18, x) ^ ROTR (41, x))
+#define sigma0(x) (ROTR ( 1, x) ^ ROTR ( 8, x) ^ SHR ( 7, x))
+#define sigma1(x) (ROTR (19, x) ^ ROTR (61, x) ^ SHR ( 6, x))
+
+#define PUT_UINT64(n,b,i) G_STMT_START{ \
+ (b)[(i) ] = (guint8) (n >> 56); \
+ (b)[(i) + 1] = (guint8) (n >> 48); \
+ (b)[(i) + 2] = (guint8) (n >> 40); \
+ (b)[(i) + 3] = (guint8) (n >> 32); \
+ (b)[(i) + 4] = (guint8) (n >> 24); \
+ (b)[(i) + 5] = (guint8) (n >> 16); \
+ (b)[(i) + 6] = (guint8) (n >> 8); \
+ (b)[(i) + 7] = (guint8) (n ); } G_STMT_END
+
+static void
+sha512_sum_init (Sha512sum *sha512)
+{
+ /* Initial Hash Value [§5.3.4] */
+ sha512->H[0] = 0x6a09e667f3bcc908;
+ sha512->H[1] = 0xbb67ae8584caa73b;
+ sha512->H[2] = 0x3c6ef372fe94f82b;
+ sha512->H[3] = 0xa54ff53a5f1d36f1;
+ sha512->H[4] = 0x510e527fade682d1;
+ sha512->H[5] = 0x9b05688c2b3e6c1f;
+ sha512->H[6] = 0x1f83d9abfb41bd6b;
+ sha512->H[7] = 0x5be0cd19137e2179;
+
+ sha512->block_len = 0;
+
+ sha512->data_len[0] = 0;
+ sha512->data_len[1] = 0;
+}
+
+/* SHA-384 and SHA-512 constants [§4.2.3] */
+static const guint64 SHA512_K[80] = {
+ 0x428a2f98d728ae22, 0x7137449123ef65cd,
+ 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
+ 0x3956c25bf348b538, 0x59f111f1b605d019,
+ 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
+ 0xd807aa98a3030242, 0x12835b0145706fbe,
+ 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
+ 0x72be5d74f27b896f, 0x80deb1fe3b1696b1,
+ 0x9bdc06a725c71235, 0xc19bf174cf692694,
+ 0xe49b69c19ef14ad2, 0xefbe4786384f25e3,
+ 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
+ 0x2de92c6f592b0275, 0x4a7484aa6ea6e483,
+ 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
+ 0x983e5152ee66dfab, 0xa831c66d2db43210,
+ 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
+ 0xc6e00bf33da88fc2, 0xd5a79147930aa725,
+ 0x06ca6351e003826f, 0x142929670a0e6e70,
+ 0x27b70a8546d22ffc, 0x2e1b21385c26c926,
+ 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
+ 0x650a73548baf63de, 0x766a0abb3c77b2a8,
+ 0x81c2c92e47edaee6, 0x92722c851482353b,
+ 0xa2bfe8a14cf10364, 0xa81a664bbc423001,
+ 0xc24b8b70d0f89791, 0xc76c51a30654be30,
+ 0xd192e819d6ef5218, 0xd69906245565a910,
+ 0xf40e35855771202a, 0x106aa07032bbd1b8,
+ 0x19a4c116b8d2d0c8, 0x1e376c085141ab53,
+ 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
+ 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,
+ 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
+ 0x748f82ee5defb2fc, 0x78a5636f43172f60,
+ 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
+ 0x90befffa23631e28, 0xa4506cebde82bde9,
+ 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
+ 0xca273eceea26619c, 0xd186b8c721c0c207,
+ 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
+ 0x06f067aa72176fba, 0x0a637dc5a2c898a6,
+ 0x113f9804bef90dae, 0x1b710b35131c471b,
+ 0x28db77f523047d84, 0x32caab7b40c72493,
+ 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
+ 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,
+ 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
+};
+
+static void
+sha512_transform (guint64 H[8],
+ guint8 const data[SHA512_BLOCK_LEN])
+{
+ gint i;
+ gint t;
+ guint64 a, b, c, d, e, f, g, h;
+ guint64 M[16];
+ guint64 W[80];
+
+ /* SHA-512 hash computation [§6.3.2] */
+
+ /* prepare the message schedule */
+ for (i = 0; i < 16; i++)
+ {
+ gint p = i * 8;
+
+ M[i] =
+ ((guint64) data[p + 0] << 56) |
+ ((guint64) data[p + 1] << 48) |
+ ((guint64) data[p + 2] << 40) |
+ ((guint64) data[p + 3] << 32) |
+ ((guint64) data[p + 4] << 24) |
+ ((guint64) data[p + 5] << 16) |
+ ((guint64) data[p + 6] << 8) |
+ ((guint64) data[p + 7] );
+ }
+
+ for (t = 0; t < 80; t++)
+ if (t < 16)
+ W[t] = M[t];
+ else
+ W[t] = sigma1 (W[t - 2]) + W[t - 7] + sigma0 (W[t - 15]) + W[t - 16];
+
+ /* initialize the eight working variables */
+ a = H[0];
+ b = H[1];
+ c = H[2];
+ d = H[3];
+ e = H[4];
+ f = H[5];
+ g = H[6];
+ h = H[7];
+
+ for (t = 0; t < 80; t++)
+ {
+ guint64 T1, T2;
+
+ T1 = h + SIGMA1 (e) + Ch (e, f, g) + SHA512_K[t] + W[t];
+ T2 = SIGMA0 (a) + Maj (a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+ }
+
+ /* Compute the intermediate hash value H */
+ H[0] += a;
+ H[1] += b;
+ H[2] += c;
+ H[3] += d;
+ H[4] += e;
+ H[5] += f;
+ H[6] += g;
+ H[7] += h;
+}
+
+static void
+sha512_sum_update (Sha512sum *sha512,
+ const guchar *buffer,
+ gsize length)
+{
+ gsize block_left, offset = 0;
+
+ if (length == 0)
+ return;
+
+ sha512->data_len[0] += length * 8;
+ if (sha512->data_len[0] < length)
+ sha512->data_len[1]++;
+
+ /* try to fill current block */
+ block_left = SHA512_BLOCK_LEN - sha512->block_len;
+ if (block_left > 0)
+ {
+ gsize fill_len;
+
+ fill_len = MIN (block_left, length);
+ memcpy (sha512->block + sha512->block_len, buffer, fill_len);
+ sha512->block_len += fill_len;
+ length -= fill_len;
+ offset += fill_len;
+
+ if (sha512->block_len == SHA512_BLOCK_LEN)
+ {
+ sha512_transform (sha512->H, sha512->block);
+ sha512->block_len = 0;
+ }
+ }
+
+ /* process complete blocks */
+ while (length >= SHA512_BLOCK_LEN)
+ {
+ memcpy (sha512->block, buffer + offset, SHA512_BLOCK_LEN);
+
+ sha512_transform (sha512->H, sha512->block);
+
+ length -= SHA512_BLOCK_LEN;
+ offset += SHA512_BLOCK_LEN;
+ }
+
+ /* keep remaining data for next block */
+ if (length > 0)
+ {
+ memcpy (sha512->block, buffer + offset, length);
+ sha512->block_len = length;
+ }
+}
+
+static void
+sha512_sum_close (Sha512sum *sha512)
+{
+ guint l;
+ gint zeros;
+ guint8 pad[SHA512_BLOCK_LEN * 2] = { 0, };
+ guint pad_len = 0;
+ gint i;
+
+ /* apply padding [§5.1.2] */
+ l = sha512->block_len * 8;
+ zeros = 896 - (l + 1);
+
+ if (zeros < 0)
+ zeros += 128 * 8;
+
+ pad[0] = 0x80; /* 1000 0000 */
+ zeros -= 7;
+ pad_len++;
+
+ memset (pad + pad_len, 0x00, zeros / 8);
+ pad_len += zeros / 8;
+ zeros = zeros % 8;
+
+ /* put message bit length at the end of padding */
+ PUT_UINT64 (sha512->data_len[1], pad, pad_len);
+ pad_len += 8;
+
+ PUT_UINT64 (sha512->data_len[0], pad, pad_len);
+ pad_len += 8;
+
+ /* update checksum with the padded block */
+ sha512_sum_update (sha512, pad, pad_len);
+
+ /* copy resulting 64-bit words into digest */
+ for (i = 0; i < 8; i++)
+ PUT_UINT64 (sha512->H[i], sha512->digest, i * 8);
+}
+
+static gchar *
+sha512_sum_to_string (Sha512sum *sha512)
+{
+ return digest_to_string (sha512->digest, SHA512_DIGEST_LEN);
+}
+
+static void
+sha512_sum_digest (Sha512sum *sha512,
+ guint8 *digest)
+{
+ memcpy (digest, sha512->digest, SHA512_DIGEST_LEN);
+}
+
+#undef Ch
+#undef Maj
+#undef SHR
+#undef ROTR
+#undef SIGMA0
+#undef SIGMA1
+#undef sigma0
+#undef sigma1
+
+#undef PUT_UINT64
/*
* Public API
@@ -1101,6 +1395,9 @@ g_checksum_type_get_length (GChecksumType checksum_type)
case G_CHECKSUM_SHA256:
len = SHA256_DIGEST_LEN;
break;
+ case G_CHECKSUM_SHA512:
+ len = SHA512_DIGEST_LEN;
+ break;
default:
len = -1;
break;
@@ -1127,7 +1424,7 @@ g_checksum_type_get_length (GChecksumType checksum_type)
* will be closed and it won't be possible to call g_checksum_update()
* on it anymore.
*
- * Return value: the newly created #GChecksum, or %NULL.
+ * Return value: (transfer full): the newly created #GChecksum, or %NULL.
* Use g_checksum_free() to free the memory allocated by it.
*
* Since: 2.16
@@ -1175,6 +1472,9 @@ g_checksum_reset (GChecksum *checksum)
case G_CHECKSUM_SHA256:
sha256_sum_init (&(checksum->sum.sha256));
break;
+ case G_CHECKSUM_SHA512:
+ sha512_sum_init (&(checksum->sum.sha512));
+ break;
default:
g_assert_not_reached ();
break;
@@ -1231,7 +1531,7 @@ g_checksum_free (GChecksum *checksum)
/**
* g_checksum_update:
* @checksum: a #GChecksum
- * @data: buffer used to compute the checksum
+ * @data: (array length=length) (element-type guint8): buffer used to compute the checksum
* @length: size of the buffer, or -1 if it is a null-terminated string.
*
* Feeds @data into an existing #GChecksum. The checksum must still be
@@ -1253,7 +1553,7 @@ g_checksum_update (GChecksum *checksum,
if (checksum->digest_str)
{
- g_warning ("The checksum `%s' has been closed and cannot be updated "
+ g_warning ("The checksum '%s' has been closed and cannot be updated "
"anymore.",
checksum->digest_str);
return;
@@ -1270,6 +1570,9 @@ g_checksum_update (GChecksum *checksum,
case G_CHECKSUM_SHA256:
sha256_sum_update (&(checksum->sum.sha256), data, length);
break;
+ case G_CHECKSUM_SHA512:
+ sha512_sum_update (&(checksum->sum.sha512), data, length);
+ break;
default:
g_assert_not_reached ();
break;
@@ -1317,6 +1620,10 @@ g_checksum_get_string (GChecksum *checksum)
sha256_sum_close (&(checksum->sum.sha256));
str = sha256_sum_to_string (&(checksum->sum.sha256));
break;
+ case G_CHECKSUM_SHA512:
+ sha512_sum_close (&(checksum->sum.sha512));
+ str = sha512_sum_to_string (&(checksum->sum.sha512));
+ break;
default:
g_assert_not_reached ();
break;
@@ -1328,7 +1635,7 @@ g_checksum_get_string (GChecksum *checksum)
}
/**
- * g_checksum_get_digest:
+ * g_checksum_get_digest: (skip)
* @checksum: a #GChecksum
* @buffer: output buffer
* @digest_len: an inout parameter. The caller initializes it to the size of @buffer.
@@ -1384,6 +1691,14 @@ g_checksum_get_digest (GChecksum *checksum,
}
sha256_sum_digest (&(checksum->sum.sha256), buffer);
break;
+ case G_CHECKSUM_SHA512:
+ if (checksum_open)
+ {
+ sha512_sum_close (&(checksum->sum.sha512));
+ str = sha512_sum_to_string (&(checksum->sum.sha512));
+ }
+ sha512_sum_digest (&(checksum->sum.sha512), buffer);
+ break;
default:
g_assert_not_reached ();
break;
@@ -1398,7 +1713,7 @@ g_checksum_get_digest (GChecksum *checksum,
/**
* g_compute_checksum_for_data:
* @checksum_type: a #GChecksumType
- * @data: binary blob to compute the digest of
+ * @data: (array length=length) (element-type guint8): binary blob to compute the digest of
* @length: length of @data
*
* Computes the checksum for a binary @data of @length. This is a
@@ -1462,3 +1777,33 @@ g_compute_checksum_for_string (GChecksumType checksum_type,
return g_compute_checksum_for_data (checksum_type, (const guchar *) str, length);
}
+
+/**
+ * g_compute_checksum_for_bytes:
+ * @checksum_type: a #GChecksumType
+ * @data: binary blob to compute the digest of
+ *
+ * Computes the checksum for a binary @data. This is a
+ * convenience wrapper for g_checksum_new(), g_checksum_get_string()
+ * and g_checksum_free().
+ *
+ * The hexadecimal string returned will be in lower case.
+ *
+ * Return value: the digest of the binary data as a string in hexadecimal.
+ * The returned string should be freed with g_free() when done using it.
+ *
+ * Since: 2.34
+ */
+gchar *
+g_compute_checksum_for_bytes (GChecksumType checksum_type,
+ GBytes *data)
+{
+ gconstpointer byte_data;
+ gsize length;
+
+ g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL);
+ g_return_val_if_fail (data != NULL, NULL);
+
+ byte_data = g_bytes_get_data (data, &length);
+ return g_compute_checksum_for_data (checksum_type, byte_data, length);
+}
diff --git a/glib/glib/gchecksum.h b/glib/glib/gchecksum.h
index 69fe1f4..ba500a2 100644
--- a/glib/glib/gchecksum.h
+++ b/glib/glib/gchecksum.h
@@ -18,14 +18,15 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_CHECKSUM_H__
+#define __G_CHECKSUM_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_CHECKSUM_H__
-#define __G_CHECKSUM_H__
-
#include <glib/gtypes.h>
+#include <glib/gbytes.h>
G_BEGIN_DECLS
@@ -34,6 +35,7 @@ G_BEGIN_DECLS
* @G_CHECKSUM_MD5: Use the MD5 hashing algorithm
* @G_CHECKSUM_SHA1: Use the SHA-1 hashing algorithm
* @G_CHECKSUM_SHA256: Use the SHA-256 hashing algorithm
+ * @G_CHECKSUM_SHA512: Use the SHA-512 hashing algorithm
*
* The hashing algorithm to be used by #GChecksum when performing the
* digest of some data.
@@ -46,7 +48,8 @@ G_BEGIN_DECLS
typedef enum {
G_CHECKSUM_MD5,
G_CHECKSUM_SHA1,
- G_CHECKSUM_SHA256
+ G_CHECKSUM_SHA256,
+ G_CHECKSUM_SHA512
} GChecksumType;
/**
@@ -60,27 +63,41 @@ typedef enum {
*/
typedef struct _GChecksum GChecksum;
+GLIB_AVAILABLE_IN_ALL
gssize g_checksum_type_get_length (GChecksumType checksum_type);
+GLIB_AVAILABLE_IN_ALL
GChecksum * g_checksum_new (GChecksumType checksum_type);
+GLIB_AVAILABLE_IN_ALL
void g_checksum_reset (GChecksum *checksum);
+GLIB_AVAILABLE_IN_ALL
GChecksum * g_checksum_copy (const GChecksum *checksum);
+GLIB_AVAILABLE_IN_ALL
void g_checksum_free (GChecksum *checksum);
+GLIB_AVAILABLE_IN_ALL
void g_checksum_update (GChecksum *checksum,
const guchar *data,
gssize length);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_checksum_get_string (GChecksum *checksum);
+GLIB_AVAILABLE_IN_ALL
void g_checksum_get_digest (GChecksum *checksum,
guint8 *buffer,
gsize *digest_len);
+GLIB_AVAILABLE_IN_ALL
gchar *g_compute_checksum_for_data (GChecksumType checksum_type,
const guchar *data,
gsize length);
+GLIB_AVAILABLE_IN_ALL
gchar *g_compute_checksum_for_string (GChecksumType checksum_type,
const gchar *str,
gssize length);
+GLIB_AVAILABLE_IN_2_34
+gchar *g_compute_checksum_for_bytes (GChecksumType checksum_type,
+ GBytes *data);
+
G_END_DECLS
#endif /* __G_CHECKSUM_H__ */
diff --git a/glib/glib/gconvert.c b/glib/glib/gconvert.c
index e18f3c1..c28e171 100644
--- a/glib/glib/gconvert.c
+++ b/glib/glib/gconvert.c
@@ -43,7 +43,7 @@
#include "gconvert.h"
-#include "gcharset.h"
+#include "gcharsetprivate.h"
#include "gslist.h"
#include "gstrfuncs.h"
#include "gtestutils.h"
@@ -51,11 +51,6 @@
#include "gunicode.h"
#include "gfileutils.h"
-#ifdef NEED_ICONV_CACHE
-#include "glist.h"
-#include "ghash.h"
-#endif
-
#include "glibintl.h"
#if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H)
@@ -194,11 +189,7 @@
*/
#define NUL_TERMINATOR_LENGTH 4
-GQuark
-g_convert_error_quark (void)
-{
- return g_quark_from_static_string ("g_convert_error");
-}
+G_DEFINE_QUARK (g_convert_error, g_convert_error)
static gboolean
try_conversion (const char *to_codeset,
@@ -233,7 +224,7 @@ try_to_aliases (const char **to_aliases,
return FALSE;
}
-G_GNUC_INTERNAL extern const char **
+extern const char **
_g_charset_get_aliases (const char *canonical_name);
/**
@@ -337,296 +328,6 @@ g_iconv_close (GIConv 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,
@@ -664,8 +365,6 @@ close_converter (GIConv cd)
return g_iconv_close (cd);
}
-#endif /* NEED_ICONV_CACHE */
-
/**
* g_convert_with_iconv:
* @str: the string to convert
@@ -1500,15 +1199,15 @@ g_filename_to_utf8 (const gchar *opsysstring,
* @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.
+ * @bytes_read: (out) (allow-none): 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
+ * @bytes_written: (out): the number of bytes stored in the output buffer (not
* including the terminating nul).
* @error: location to store the error occurring, or %NULL to ignore
* errors. Any of the errors in #GConvertError may occur.
@@ -1518,7 +1217,8 @@ g_filename_to_utf8 (const gchar *opsysstring,
* 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.
+ * Return value: (array length=bytes_written) (element-type guint8) (transfer full):
+ * The converted string, or %NULL on an error.
**/
gchar*
g_filename_from_utf8 (const gchar *utf8string,
@@ -1838,7 +1538,7 @@ hostname_validate (const char *hostname)
/**
* g_filename_from_uri:
* @uri: a uri describing a filename (escaped, encoded in ASCII).
- * @hostname: (allow-none): Location to store hostname for the URI, or %NULL.
+ * @hostname: (out) (allow-none): 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 occurring, or %NULL to ignore
@@ -1847,8 +1547,8 @@ hostname_validate (const char *hostname)
* 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.
+ * Return value: (type filename): a newly-allocated string holding
+ * the resulting filename, or %NULL on an error.
**/
gchar *
g_filename_from_uri (const gchar *uri,
@@ -2079,9 +1779,9 @@ g_filename_to_uri (const gchar *filename,
* 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().
+ * Returns: (transfer full): a newly allocated %NULL-terminated list
+ * of strings holding the individual URIs. The array should be freed
+ * with g_strfreev().
*
* Since: 2.6
*/
diff --git a/glib/glib/gconvert.h b/glib/glib/gconvert.h
index 7fd16c8..1945c07 100644
--- a/glib/glib/gconvert.h
+++ b/glib/glib/gconvert.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_CONVERT_H__
+#define __G_CONVERT_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_CONVERT_H__
-#define __G_CONVERT_H__
-
#include <glib/gerror.h>
G_BEGIN_DECLS
@@ -65,6 +65,7 @@ typedef enum
* error domains.
*/
#define G_CONVERT_ERROR g_convert_error_quark()
+GLIB_AVAILABLE_IN_ALL
GQuark g_convert_error_quark (void);
/**
@@ -76,16 +77,20 @@ GQuark g_convert_error_quark (void);
*/
typedef struct _GIConv *GIConv;
+GLIB_AVAILABLE_IN_ALL
GIConv g_iconv_open (const gchar *to_codeset,
const gchar *from_codeset);
+GLIB_AVAILABLE_IN_ALL
gsize g_iconv (GIConv converter,
gchar **inbuf,
gsize *inbytes_left,
gchar **outbuf,
gsize *outbytes_left);
+GLIB_AVAILABLE_IN_ALL
gint g_iconv_close (GIConv converter);
+GLIB_AVAILABLE_IN_ALL
gchar* g_convert (const gchar *str,
gssize len,
const gchar *to_codeset,
@@ -93,12 +98,14 @@ gchar* g_convert (const gchar *str,
gsize *bytes_read,
gsize *bytes_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_convert_with_iconv (const gchar *str,
gssize len,
GIConv converter,
gsize *bytes_read,
gsize *bytes_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_convert_with_fallback (const gchar *str,
gssize len,
const gchar *to_codeset,
@@ -111,11 +118,13 @@ gchar* g_convert_with_fallback (const gchar *str,
/* Convert between libc's idea of strings and UTF-8.
*/
+GLIB_AVAILABLE_IN_ALL
gchar* g_locale_to_utf8 (const gchar *opsysstring,
gssize len,
gsize *bytes_read,
gsize *bytes_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_locale_from_utf8 (const gchar *utf8string,
gssize len,
gsize *bytes_read,
@@ -125,40 +134,67 @@ gchar* g_locale_from_utf8 (const gchar *utf8string,
/* Convert between the operating system (or C runtime)
* representation of file names and UTF-8.
*/
-#ifndef __GTK_DOC_IGNORE__
-#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
-#endif
-
+GLIB_AVAILABLE_IN_ALL
gchar* g_filename_to_utf8 (const gchar *opsysstring,
gssize len,
gsize *bytes_read,
gsize *bytes_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_filename_from_utf8 (const gchar *utf8string,
gssize len,
gsize *bytes_read,
gsize *bytes_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_filename_from_uri (const gchar *uri,
gchar **hostname,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_filename_to_uri (const gchar *filename,
const gchar *hostname,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_filename_display_name (const gchar *filename) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_get_filename_charsets (const gchar ***charsets);
+GLIB_AVAILABLE_IN_ALL
gchar *g_filename_display_basename (const gchar *filename) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar **g_uri_list_extract_uris (const gchar *uri_list) G_GNUC_MALLOC;
+#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
+
+GLIB_AVAILABLE_IN_ALL
+gchar* g_filename_to_utf8_utf8 (const gchar *opsysstring,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
+gchar* g_filename_from_utf8_utf8 (const gchar *utf8string,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
+gchar *g_filename_from_uri_utf8 (const gchar *uri,
+ gchar **hostname,
+ GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
+gchar *g_filename_to_uri_utf8 (const gchar *filename,
+ const gchar *hostname,
+ GError **error) G_GNUC_MALLOC;
+#endif
+
G_END_DECLS
#endif /* __G_CONVERT_H__ */
diff --git a/glib/glib/gdataset.c b/glib/glib/gdataset.c
index 80f5094..006bdc1 100644
--- a/glib/glib/gdataset.c
+++ b/glib/glib/gdataset.c
@@ -185,10 +185,8 @@ static inline gpointer g_data_set_internal (GData **datalist,
GDestroyNotify destroy_func,
GDataset *dataset);
static void g_data_initialize (void);
-static inline GQuark g_quark_new (gchar *string);
-
-/* Locking model:
+/* Locking model:
* Each standalone GDataList is protected by a bitlock in the datalist pointer,
* which protects that modification of the non-flags part of the datalist pointer
* and the contents of the datalist.
@@ -204,10 +202,6 @@ G_LOCK_DEFINE_STATIC (g_dataset_global);
static GHashTable *g_dataset_location_ht = NULL;
static GDataset *g_dataset_cached = NULL; /* should this be
thread specific? */
-G_LOCK_DEFINE_STATIC (g_quark_global);
-static GHashTable *g_quark_ht = NULL;
-static gchar **g_quarks = NULL;
-static int g_quark_seq_id = 0;
/* --- functions --- */
@@ -684,10 +678,11 @@ g_datalist_id_set_data_full (GData **datalist,
* g_dataset_id_remove_no_notify:
* @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.
*
* Removes an element, without calling its destroy notification
* function.
+ *
+ * Returns: the data previously stored at @key_id, or %NULL if none.
**/
/**
* g_dataset_remove_no_notify:
@@ -722,10 +717,11 @@ g_dataset_id_remove_no_notify (gconstpointer dataset_location,
* g_datalist_id_remove_no_notify:
* @datalist: a datalist.
* @key_id: the #GQuark identifying a data element.
- * @Returns: the data previously stored at @key_id, or %NULL if none.
*
* Removes an element, without calling its destroy notification
* function.
+ *
+ * Returns: the data previously stored at @key_id, or %NULL if none.
**/
/**
* g_datalist_remove_no_notify:
@@ -752,19 +748,21 @@ g_datalist_id_remove_no_notify (GData **datalist,
* g_dataset_id_get_data:
* @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.
*
* Gets the data element corresponding to a #GQuark.
+ *
+ * Returns: the data element corresponding to the #GQuark, or %NULL if
+ * it is not found.
**/
/**
* g_dataset_get_data:
* @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.
*
* Gets the data element corresponding to a string.
+ *
+ * Returns: the data element corresponding to the string, or %NULL if
+ * it is not found.
**/
gpointer
g_dataset_id_get_data (gconstpointer dataset_location,
@@ -792,54 +790,229 @@ g_dataset_id_get_data (gconstpointer dataset_location,
* g_datalist_id_get_data:
* @datalist: a datalist.
* @key_id: the #GQuark identifying a data element.
- * @Returns: the data element, or %NULL if it is not found.
*
* Retrieves the data element corresponding to @key_id.
- **/
+ *
+ * Returns: the data element, or %NULL if it is not found.
+ */
gpointer
-g_datalist_id_get_data (GData **datalist,
- GQuark key_id)
+g_datalist_id_get_data (GData **datalist,
+ GQuark key_id)
{
- gpointer res = NULL;
+ return g_datalist_id_dup_data (datalist, key_id, NULL, NULL);
+}
+
+/**
+ * GDuplicateFunc:
+ * @data: the data to duplicate
+ * @user_data: user data that was specified in g_datalist_id_dup_data()
+ *
+ * The type of functions that are used to 'duplicate' an object.
+ * What this means depends on the context, it could just be
+ * incrementing the reference count, if @data is a ref-counted
+ * object.
+ *
+ * Returns: a duplicate of data
+ */
+
+/**
+ * g_datalist_id_dup_data:
+ * @datalist: location of a datalist
+ * @key_id: the #GQuark identifying a data element
+ * @dup_func: (allow-none): function to duplicate the old value
+ * @user_data: (allow-none): passed as user_data to @dup_func
+ *
+ * This is a variant of g_datalist_id_get_data() which
+ * returns a 'duplicate' of the value. @dup_func defines the
+ * meaning of 'duplicate' in this context, it could e.g.
+ * take a reference on a ref-counted object.
+ *
+ * If the @key_id is not set in the datalist then @dup_func
+ * will be called with a %NULL argument.
+ *
+ * Note that @dup_func is called while the datalist is locked, so it
+ * is not allowed to read or modify the datalist.
+ *
+ * This function can be useful to avoid races when multiple
+ * threads are using the same datalist and the same key.
+ *
+ * Returns: the result of calling @dup_func on the value
+ * associated with @key_id in @datalist, or %NULL if not set.
+ * If @dup_func is %NULL, the value is returned unmodified.
+ *
+ * Since: 2.34
+ */
+gpointer
+g_datalist_id_dup_data (GData **datalist,
+ GQuark key_id,
+ GDuplicateFunc dup_func,
+ gpointer user_data)
+{
+ gpointer val = NULL;
+ gpointer retval = NULL;
+ GData *d;
+ GDataElt *data, *data_end;
g_return_val_if_fail (datalist != NULL, NULL);
- if (key_id)
+ g_return_val_if_fail (key_id != 0, NULL);
+
+ g_datalist_lock (datalist);
+
+ d = G_DATALIST_GET_POINTER (datalist);
+ if (d)
{
- GData *d;
- GDataElt *data, *data_end;
+ data = d->data;
+ data_end = data + d->len - 1;
+ while (data <= data_end)
+ {
+ if (data->key == key_id)
+ {
+ val = data->data;
+ break;
+ }
+ data++;
+ }
+ }
- g_datalist_lock (datalist);
+ if (dup_func)
+ retval = dup_func (val, user_data);
+ else
+ retval = val;
- d = G_DATALIST_GET_POINTER (datalist);
- if (d)
+ g_datalist_unlock (datalist);
+
+ return retval;
+}
+
+/**
+ * g_datalist_id_replace_data:
+ * @datalist: location of a datalist
+ * @key_id: the #GQuark identifying a data element
+ * @oldval: (allow-none): the old value to compare against
+ * @newval: (allow-none): the new value to replace it with
+ * @destroy: (allow-none): destroy notify for the new value
+ * @old_destroy: (allow-none): destroy notify for the existing value
+ *
+ * Compares the member that is associated with @key_id in
+ * @datalist to @oldval, and if they are the same, replace
+ * @oldval with @newval.
+ *
+ * This is like a typical atomic compare-and-exchange
+ * operation, for a member of @datalist.
+ *
+ * If the previous value was replaced then ownership of the
+ * old value (@oldval) is passed to the caller, including
+ * the registred destroy notify for it (passed out in @old_destroy).
+ * Its up to the caller to free this as he wishes, which may
+ * or may not include using @old_destroy as sometimes replacement
+ * should not destroy the object in the normal way.
+ *
+ * Return: %TRUE if the existing value for @key_id was replaced
+ * by @newval, %FALSE otherwise.
+ *
+ * Since: 2.34
+ */
+gboolean
+g_datalist_id_replace_data (GData **datalist,
+ GQuark key_id,
+ gpointer oldval,
+ gpointer newval,
+ GDestroyNotify destroy,
+ GDestroyNotify *old_destroy)
+{
+ gpointer val = NULL;
+ GData *d;
+ GDataElt *data, *data_end;
+
+ g_return_val_if_fail (datalist != NULL, FALSE);
+ g_return_val_if_fail (key_id != 0, FALSE);
+
+ if (old_destroy)
+ *old_destroy = NULL;
+
+ g_datalist_lock (datalist);
+
+ d = G_DATALIST_GET_POINTER (datalist);
+ if (d)
+ {
+ data = d->data;
+ data_end = data + d->len - 1;
+ while (data <= data_end)
+ {
+ if (data->key == key_id)
+ {
+ val = data->data;
+ if (val == oldval)
+ {
+ if (old_destroy)
+ *old_destroy = data->destroy;
+ if (newval != NULL)
+ {
+ data->data = newval;
+ data->destroy = destroy;
+ }
+ else
+ {
+ if (data != data_end)
+ *data = *data_end;
+ d->len--;
+
+ /* We don't bother to shrink, but if all data are now gone
+ * we at least free the memory
+ */
+ if (d->len == 0)
+ {
+ G_DATALIST_SET_POINTER (datalist, NULL);
+ g_free (d);
+ }
+ }
+ }
+ break;
+ }
+ data++;
+ }
+ }
+
+ if (val == NULL && oldval == NULL && newval != NULL)
+ {
+ GData *old_d;
+
+ /* insert newval */
+ old_d = d;
+ if (d == NULL)
{
- data = d->data;
- data_end = data + d->len;
- while (data < data_end)
- {
- if (data->key == key_id)
- {
- res = data->data;
- break;
- }
- data++;
- }
- }
+ d = g_malloc (sizeof (GData));
+ d->len = 0;
+ d->alloc = 1;
+ }
+ else if (d->len == d->alloc)
+ {
+ d->alloc = d->alloc * 2;
+ d = g_realloc (d, sizeof (GData) + (d->alloc - 1) * sizeof (GDataElt));
+ }
+ if (old_d != d)
+ G_DATALIST_SET_POINTER (datalist, d);
- g_datalist_unlock (datalist);
+ d->data[d->len].key = key_id;
+ d->data[d->len].data = newval;
+ d->data[d->len].destroy = destroy;
+ d->len++;
}
- return res;
+ g_datalist_unlock (datalist);
+
+ return val == oldval;
}
/**
* g_datalist_get_data:
* @datalist: a datalist.
* @key: the string identifying a data element.
- * @Returns: the data element, or %NULL if it is not found.
*
* Gets a data element, using its string identifier. This is slower than
* g_datalist_id_get_data() because it compares strings.
+ *
+ * Returns: the data element, or %NULL if it is not found.
**/
gpointer
g_datalist_get_data (GData **datalist,
@@ -1069,294 +1242,3 @@ g_data_initialize (void)
g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL);
g_dataset_cached = NULL;
}
-
-/**
- * SECTION:quarks
- * @title: Quarks
- * @short_description: a 2-way association between a string and a
- * unique integer identifier
- *
- * Quarks are associations between strings and integer identifiers.
- * Given either the string or the #GQuark identifier it is possible to
- * retrieve the other.
- *
- * Quarks are used for both <link
- * linkend="glib-Datasets">Datasets</link> and <link
- * linkend="glib-Keyed-Data-Lists">Keyed Data Lists</link>.
- *
- * To create a new quark from a string, use g_quark_from_string() or
- * g_quark_from_static_string().
- *
- * To find the string corresponding to a given #GQuark, use
- * g_quark_to_string().
- *
- * To find the #GQuark corresponding to a given string, use
- * g_quark_try_string().
- *
- * 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 comparison, rather than using strcmp().
- **/
-
-/**
- * GQuark:
- *
- * A GQuark is a non-zero integer which uniquely identifies a
- * particular string. A GQuark value of zero is associated to %NULL.
- **/
-
-/**
- * g_quark_try_string:
- * @string: (allow-none): a string.
- * @Returns: the #GQuark associated with the string, or 0 if @string is
- * %NULL or there is no #GQuark associated with it.
- *
- * Gets the #GQuark associated with the given string, or 0 if string is
- * %NULL or it has no associated #GQuark.
- *
- * 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().
- **/
-GQuark
-g_quark_try_string (const gchar *string)
-{
- GQuark quark = 0;
-
- if (string == NULL)
- return 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;
-}
-
-#define QUARK_STRING_BLOCK_SIZE (4096 - sizeof (gsize))
-static char *quark_block = NULL;
-static int quark_block_offset = 0;
-
-/* HOLDS: g_quark_global_lock */
-static char *
-quark_strdup(const gchar *string)
-{
- gchar *copy;
- gsize len;
-
- len = strlen (string) + 1;
-
- /* For strings longer than half the block size, fall back
- to strdup so that we fill our blocks at least 50%. */
- if (len > QUARK_STRING_BLOCK_SIZE / 2)
- return g_strdup (string);
-
- if (quark_block == NULL ||
- QUARK_STRING_BLOCK_SIZE - quark_block_offset < len)
- {
- quark_block = g_malloc (QUARK_STRING_BLOCK_SIZE);
- quark_block_offset = 0;
- }
-
- copy = quark_block + quark_block_offset;
- memcpy (copy, string, len);
- quark_block_offset += len;
-
- return copy;
-}
-
-/* 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 ? quark_strdup (string) : (gchar *)string);
- TRACE(GLIB_QUARK_NEW(string, quark));
- }
-
- return quark;
-}
-
-/**
- * g_quark_from_string:
- * @string: (allow-none): a string.
- * @Returns: the #GQuark identifying the string, or 0 if @string is
- * %NULL.
- *
- * 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.
- **/
-GQuark
-g_quark_from_string (const gchar *string)
-{
- GQuark quark;
-
- if (!string)
- return 0;
-
- G_LOCK (g_quark_global);
- quark = g_quark_from_string_internal (string, TRUE);
- G_UNLOCK (g_quark_global);
-
- return quark;
-}
-
-/**
- * g_quark_from_static_string:
- * @string: (allow-none): a string.
- * @Returns: the #GQuark identifying the string, or 0 if @string is
- * %NULL.
- *
- * 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.
- *
- * 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).
- **/
-GQuark
-g_quark_from_static_string (const gchar *string)
-{
- GQuark quark;
-
- if (!string)
- return 0;
-
- G_LOCK (g_quark_global);
- quark = g_quark_from_string_internal (string, FALSE);
- G_UNLOCK (g_quark_global);
-
- return quark;
-}
-
-/**
- * g_quark_to_string:
- * @quark: a #GQuark.
- * @Returns: the string associated with the #GQuark.
- *
- * Gets the string associated with the given #GQuark.
- **/
-const gchar *
-g_quark_to_string (GQuark quark)
-{
- gchar* result = NULL;
- gchar **quarks;
- gint quark_seq_id;
-
- quark_seq_id = g_atomic_int_get (&g_quark_seq_id);
- quarks = g_atomic_pointer_get (&g_quarks);
-
- if (quark < quark_seq_id)
- result = quarks[quark];
-
- return result;
-}
-
-/* HOLDS: g_quark_global_lock */
-static inline GQuark
-g_quark_new (gchar *string)
-{
- GQuark quark;
- gchar **g_quarks_new;
-
- if (g_quark_seq_id % G_QUARK_BLOCK_SIZE == 0)
- {
- g_quarks_new = g_new (gchar*, g_quark_seq_id + G_QUARK_BLOCK_SIZE);
- if (g_quark_seq_id != 0)
- memcpy (g_quarks_new, g_quarks, sizeof (char *) * g_quark_seq_id);
- memset (g_quarks_new + g_quark_seq_id, 0, sizeof (char *) * G_QUARK_BLOCK_SIZE);
- /* This leaks the old quarks array. Its unfortunate, but it allows
- us to do lockless lookup of the arrays, and there shouldn't be that
- many quarks in an app */
- g_atomic_pointer_set (&g_quarks, g_quarks_new);
- }
- 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;
- g_atomic_int_inc (&g_quark_seq_id);
- }
-
- quark = g_quark_seq_id;
- g_atomic_pointer_set (&g_quarks[quark], string);
- g_hash_table_insert (g_quark_ht, string, GUINT_TO_POINTER (quark));
- g_atomic_int_inc (&g_quark_seq_id);
-
- return quark;
-}
-
-/**
- * g_intern_string:
- * @string: (allow-none): 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
- */
-const 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: (allow-none): 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
- */
-const 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;
-}
diff --git a/glib/glib/gdataset.h b/glib/glib/gdataset.h
index eab296b..6d69e60 100644
--- a/glib/glib/gdataset.h
+++ b/glib/glib/gdataset.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_DATASET_H__
+#define __G_DATASET_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DATASET_H__
-#define __G_DATASET_H__
-
#include <glib/gquark.h>
G_BEGIN_DECLS
@@ -43,16 +43,38 @@ typedef void (*GDataForeachFunc) (GQuark key_id,
/* Keyed Data List
*/
+GLIB_AVAILABLE_IN_ALL
void g_datalist_init (GData **datalist);
+GLIB_AVAILABLE_IN_ALL
void g_datalist_clear (GData **datalist);
+GLIB_AVAILABLE_IN_ALL
gpointer g_datalist_id_get_data (GData **datalist,
GQuark key_id);
+GLIB_AVAILABLE_IN_ALL
void g_datalist_id_set_data_full (GData **datalist,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func);
+
+typedef gpointer (*GDuplicateFunc) (gpointer data, gpointer user_data);
+
+GLIB_AVAILABLE_IN_2_34
+gpointer g_datalist_id_dup_data (GData **datalist,
+ GQuark key_id,
+ GDuplicateFunc dup_func,
+ gpointer user_data);
+GLIB_AVAILABLE_IN_2_34
+gboolean g_datalist_id_replace_data (GData **datalist,
+ GQuark key_id,
+ gpointer oldval,
+ gpointer newval,
+ GDestroyNotify destroy,
+ GDestroyNotify *old_destroy);
+
+GLIB_AVAILABLE_IN_ALL
gpointer g_datalist_id_remove_no_notify (GData **datalist,
GQuark key_id);
+GLIB_AVAILABLE_IN_ALL
void g_datalist_foreach (GData **datalist,
GDataForeachFunc func,
gpointer user_data);
@@ -66,10 +88,13 @@ void g_datalist_foreach (GData **datalist,
*/
#define G_DATALIST_FLAGS_MASK 0x3
+GLIB_AVAILABLE_IN_ALL
void g_datalist_set_flags (GData **datalist,
guint flags);
+GLIB_AVAILABLE_IN_ALL
void g_datalist_unset_flags (GData **datalist,
guint flags);
+GLIB_AVAILABLE_IN_ALL
guint g_datalist_get_flags (GData **datalist);
#define g_datalist_id_set_data(dl, q, d) \
@@ -85,20 +110,25 @@ guint g_datalist_get_flags (GData **datalist);
#define g_datalist_remove_data(dl, k) \
g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL)
-
/* Location Associated Keyed Data
*/
+GLIB_AVAILABLE_IN_ALL
void g_dataset_destroy (gconstpointer dataset_location);
+GLIB_AVAILABLE_IN_ALL
gpointer g_dataset_id_get_data (gconstpointer dataset_location,
GQuark key_id);
+GLIB_AVAILABLE_IN_ALL
gpointer g_datalist_get_data (GData **datalist,
const gchar *key);
+GLIB_AVAILABLE_IN_ALL
void g_dataset_id_set_data_full (gconstpointer dataset_location,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func);
+GLIB_AVAILABLE_IN_ALL
gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location,
GQuark key_id);
+GLIB_AVAILABLE_IN_ALL
void g_dataset_foreach (gconstpointer dataset_location,
GDataForeachFunc func,
gpointer user_data);
diff --git a/glib/glib/gdate.c b/glib/glib/gdate.c
index d9b25f3..1978cf7 100644
--- a/glib/glib/gdate.c
+++ b/glib/glib/gdate.c
@@ -1096,7 +1096,7 @@ g_date_prepare_to_parse (const gchar *str,
++i;
}
DEBUG_MSG (("**Order: %s, %s, %s", strings[0], strings[1], strings[2]));
- DEBUG_MSG (("**Sample date in this locale: `%s'", buf));
+ DEBUG_MSG (("**Sample date in this locale: '%s'", buf));
}
#endif
}
@@ -1137,7 +1137,7 @@ g_date_set_parse (GDate *d,
g_date_prepare_to_parse (str, &pt);
- DEBUG_MSG (("Found %d ints, `%d' `%d' `%d' and written out month %d",
+ 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));
diff --git a/glib/glib/gdate.h b/glib/glib/gdate.h
index 5ef1850..ad02879 100644
--- a/glib/glib/gdate.h
+++ b/glib/glib/gdate.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_DATE_H__
+#define __G_DATE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DATE_H__
-#define __G_DATE_H__
-
#include <time.h>
#include <glib/gtypes.h>
@@ -119,11 +119,15 @@ struct _GDate
* to get a usable object. You can also allocate a GDate statically,
* then call g_date_clear() to initialize.
*/
+GLIB_AVAILABLE_IN_ALL
GDate* g_date_new (void);
+GLIB_AVAILABLE_IN_ALL
GDate* g_date_new_dmy (GDateDay day,
GDateMonth month,
GDateYear year);
+GLIB_AVAILABLE_IN_ALL
GDate* g_date_new_julian (guint32 julian_day);
+GLIB_AVAILABLE_IN_ALL
void g_date_free (GDate *date);
/* check g_date_valid() after doing an operation that might fail, like
@@ -131,21 +135,34 @@ void g_date_free (GDate *date);
* dates (the exceptions are the mutators, since you need those to
* return to validity).
*/
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_valid_dmy (GDateDay day,
GDateMonth month,
GDateYear year) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
GDateWeekday g_date_get_weekday (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
GDateMonth g_date_get_month (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
GDateYear g_date_get_year (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
GDateDay g_date_get_day (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
guint32 g_date_get_julian (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
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
@@ -153,14 +170,18 @@ guint g_date_get_day_of_year (const GDate *date);
* these functions return the number of weeks, starting on the
* corrsponding day
*/
+GLIB_AVAILABLE_IN_ALL
guint g_date_get_monday_week_of_year (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
guint g_date_get_sunday_week_of_year (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
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.
*/
+GLIB_AVAILABLE_IN_ALL
void g_date_clear (GDate *date,
guint n_dates);
@@ -168,10 +189,13 @@ void g_date_clear (GDate *date,
* permits many formats but tries to catch common typos. If your data
* needs to be strictly validated, it is not an appropriate function.
*/
+GLIB_AVAILABLE_IN_ALL
void g_date_set_parse (GDate *date,
const gchar *str);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_time_t (GDate *date,
time_t timet);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_time_val (GDate *date,
GTimeVal *timeval);
#ifndef G_DISABLE_DEPRECATED
@@ -179,65 +203,88 @@ GLIB_DEPRECATED_FOR(g_date_set_time_t)
void g_date_set_time (GDate *date,
GTime time_);
#endif
+GLIB_AVAILABLE_IN_ALL
void g_date_set_month (GDate *date,
GDateMonth month);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_day (GDate *date,
GDateDay day);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_year (GDate *date,
GDateYear year);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_dmy (GDate *date,
GDateDay day,
GDateMonth month,
GDateYear y);
+GLIB_AVAILABLE_IN_ALL
void g_date_set_julian (GDate *date,
guint32 julian_date);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_is_first_of_month (const GDate *date);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_is_last_of_month (const GDate *date);
/* To go forward by some number of weeks just go forward weeks*7 days */
+GLIB_AVAILABLE_IN_ALL
void g_date_add_days (GDate *date,
guint n_days);
+GLIB_AVAILABLE_IN_ALL
void g_date_subtract_days (GDate *date,
guint n_days);
/* If you add/sub months while day > 28, the day might change */
+GLIB_AVAILABLE_IN_ALL
void g_date_add_months (GDate *date,
guint n_months);
+GLIB_AVAILABLE_IN_ALL
void g_date_subtract_months (GDate *date,
guint n_months);
/* If it's feb 29, changing years can move you to the 28th */
+GLIB_AVAILABLE_IN_ALL
void g_date_add_years (GDate *date,
guint n_years);
+GLIB_AVAILABLE_IN_ALL
void g_date_subtract_years (GDate *date,
guint n_years);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_is_leap_year (GDateYear year) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
guint8 g_date_get_days_in_month (GDateMonth month,
GDateYear year) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
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. */
+GLIB_AVAILABLE_IN_ALL
gint g_date_days_between (const GDate *date1,
const GDate *date2);
/* qsort-friendly (with a cast...) */
+GLIB_AVAILABLE_IN_ALL
gint g_date_compare (const GDate *lhs,
const GDate *rhs);
+GLIB_AVAILABLE_IN_ALL
void g_date_to_struct_tm (const GDate *date,
struct tm *tm);
+GLIB_AVAILABLE_IN_ALL
void g_date_clamp (GDate *date,
const GDate *min_date,
const GDate *max_date);
/* Swap date1 and date2's values if date1 > date2. */
+GLIB_AVAILABLE_IN_ALL
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.
*/
+GLIB_AVAILABLE_IN_ALL
gsize g_date_strftime (gchar *s,
gsize slen,
const gchar *format,
diff --git a/glib/glib/gdatetime.c b/glib/glib/gdatetime.c
index 7f78b84..ccfe574 100644
--- a/glib/glib/gdatetime.c
+++ b/glib/glib/gdatetime.c
@@ -115,9 +115,6 @@
struct _GDateTime
{
- /* 1 is 0001-01-01 in Proleptic Gregorian */
- gint32 days;
-
/* Microsecond timekeeping within Day */
guint64 usec;
@@ -125,6 +122,9 @@ struct _GDateTime
GTimeZone *tz;
gint interval;
+ /* 1 is 0001-01-01 in Proleptic Gregorian */
+ gint32 days;
+
volatile gint ref_count;
};
@@ -948,6 +948,14 @@ g_date_time_new (GTimeZone *tz,
GDateTime *datetime;
gint64 full_time;
+ if (year < 1 || year > 9999 ||
+ month < 1 || month > 12 ||
+ day < 1 || day > 31 ||
+ hour < 0 || hour > 23 ||
+ minute < 0 || minute > 59 ||
+ seconds < 0.0 || seconds >= 60.0)
+ return NULL;
+
datetime = g_date_time_alloc (tz);
datetime->days = ymd_to_days (year, month, day);
datetime->usec = (hour * USEC_PER_HOUR)
@@ -989,7 +997,7 @@ g_date_time_new (GTimeZone *tz,
*
* Returns: a #GDateTime, or %NULL
*
- * Since: 2.26.
+ * Since: 2.26
**/
GDateTime *
g_date_time_new_local (gint year,
@@ -1026,7 +1034,7 @@ g_date_time_new_local (gint year,
*
* Returns: a #GDateTime, or %NULL
*
- * Since: 2.26.
+ * Since: 2.26
**/
GDateTime *
g_date_time_new_utc (gint year,
@@ -1390,7 +1398,7 @@ g_date_time_compare (gconstpointer dt1,
*
* Calculates the difference in time between @end and @begin. The
* #GTimeSpan that is returned is effectively @end - @begin (ie:
- * positive if the first simparameter is larger).
+ * positive if the first parameter is larger).
*
* Return value: the difference between the two #GDateTime, as a time
* span expressed in microseconds.
@@ -2082,6 +2090,59 @@ g_date_time_to_utc (GDateTime *datetime)
/* Format {{{1 */
+static gboolean
+format_z (GString *outstr,
+ gint offset,
+ guint colons)
+{
+ gint hours;
+ gint minutes;
+ gint seconds;
+
+ hours = offset / 3600;
+ minutes = ABS (offset) / 60 % 60;
+ seconds = ABS (offset) % 60;
+
+ switch (colons)
+ {
+ case 0:
+ g_string_append_printf (outstr, "%+03d%02d",
+ hours,
+ minutes);
+ break;
+
+ case 1:
+ g_string_append_printf (outstr, "%+03d:%02d",
+ hours,
+ minutes);
+ break;
+
+ case 2:
+ g_string_append_printf (outstr, "%+03d:%02d:%02d",
+ hours,
+ minutes,
+ seconds);
+ break;
+
+ case 3:
+ g_string_append_printf (outstr, "%+03d", hours);
+
+ if (minutes != 0 || seconds != 0)
+ {
+ g_string_append_printf (outstr, ":%02d", minutes);
+
+ if (seconds != 0)
+ g_string_append_printf (outstr, ":%02d", seconds);
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
format_number (GString *str,
gboolean use_alt_digits,
@@ -2177,6 +2238,7 @@ g_date_time_format_locale (GDateTime *datetime,
gboolean locale_is_utf8)
{
guint len;
+ guint colons;
gchar *tmp;
gunichar c;
gboolean alt_digits = FALSE;
@@ -2211,6 +2273,7 @@ g_date_time_format_locale (GDateTime *datetime,
if (!*format)
break;
+ colons = 0;
alt_digits = FALSE;
pad_set = FALSE;
@@ -2302,7 +2365,7 @@ g_date_time_format_locale (GDateTime *datetime,
alt_digits = TRUE;
goto next_mod;
case 'p':
- ampm = GET_AMPM (datetime);
+ ampm = (gchar *) GET_AMPM (datetime);
if (!locale_is_utf8)
{
ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL);
@@ -2323,7 +2386,7 @@ g_date_time_format_locale (GDateTime *datetime,
g_free (ampm);
break;
case 'P':
- ampm = GET_AMPM (datetime);
+ ampm = (gchar *) GET_AMPM (datetime);
if (!locale_is_utf8)
{
ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL);
@@ -2406,17 +2469,15 @@ g_date_time_format_locale (GDateTime *datetime,
g_date_time_get_year (datetime));
break;
case 'z':
- if (datetime->tz != NULL)
- {
- gint64 offset = g_date_time_get_utc_offset (datetime)
- / USEC_PER_SECOND;
-
- g_string_append_printf (outstr, "%+03d%02d",
- (int) offset / 3600,
- (int) abs(offset) / 60 % 60);
- }
- else
- g_string_append (outstr, "+0000");
+ {
+ gint64 offset;
+ if (datetime->tz != NULL)
+ offset = g_date_time_get_utc_offset (datetime) / USEC_PER_SECOND;
+ else
+ offset = 0;
+ if (!format_z (outstr, (int) offset, colons))
+ return FALSE;
+ }
break;
case 'Z':
tz = g_date_time_get_timezone_abbreviation (datetime);
@@ -2445,6 +2506,12 @@ g_date_time_format_locale (GDateTime *datetime,
pad_set = TRUE;
pad = "0";
goto next_mod;
+ case ':':
+ /* Colons are only allowed before 'z' */
+ if (*format && *format != 'z' && *format != ':')
+ return FALSE;
+ colons++;
+ goto next_mod;
default:
return FALSE;
}
@@ -2666,7 +2733,23 @@ g_date_time_format_locale (GDateTime *datetime,
* <varlistentry><term>
* <literal>\%z</literal>:
* </term><listitem><simpara>
- * the time-zone as hour offset from UTC
+ * the time zone as an offset from UTC (+hhmm)
+ * </simpara></listitem></varlistentry>
+ * <varlistentry><term>
+ * <literal>\%:z</literal>:
+ * </term><listitem><simpara>
+ * the time zone as an offset from UTC (+hh:mm). This is a gnulib strftime extension. Since: 2.38
+ * </simpara></listitem></varlistentry>
+ * <varlistentry><term>
+ * <literal>\%::z</literal>:
+ * </term><listitem><simpara>
+ * the time zone as an offset from UTC (+hh:mm:ss). This is a gnulib strftime extension. Since: 2.38
+ * </simpara></listitem></varlistentry>
+ * <varlistentry><term>
+ * <literal>\%:::z</literal>:
+ * </term><listitem><simpara>
+ * the time zone as an offset from UTC, with : to necessary precision
+ * (e.g., -04, +05:30). This is a gnulib strftime extension. Since: 2.38
* </simpara></listitem></varlistentry>
* <varlistentry><term>
* <literal>\%Z</literal>:
diff --git a/glib/glib/gdatetime.h b/glib/glib/gdatetime.h
index 6643e3f..cbaf190 100644
--- a/glib/glib/gdatetime.h
+++ b/glib/glib/gdatetime.h
@@ -23,13 +23,13 @@
* Ryan Lortie <desrt@desrt.ca>
*/
+#ifndef __G_DATE_TIME_H__
+#define __G_DATE_TIME_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DATE_TIME_H__
-#define __G_DATE_TIME_H__
-
#include <glib/gtimezone.h>
G_BEGIN_DECLS
@@ -98,19 +98,29 @@ typedef gint64 GTimeSpan;
*/
typedef struct _GDateTime GDateTime;
+GLIB_AVAILABLE_IN_ALL
void g_date_time_unref (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_ref (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_now (GTimeZone *tz);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_now_local (void);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_now_utc (void);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_from_unix_local (gint64 t);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_from_unix_utc (gint64 t);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_from_timeval_utc (const GTimeVal *tv);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new (GTimeZone *tz,
gint year,
gint month,
@@ -118,12 +128,14 @@ GDateTime * g_date_time_new (GTimeZo
gint hour,
gint minute,
gdouble seconds);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_local (gint year,
gint month,
gint day,
gint hour,
gint minute,
gdouble seconds);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_new_utc (gint year,
gint month,
gint day,
@@ -131,33 +143,42 @@ GDateTime * g_date_time_new_utc (gint
gint minute,
gdouble seconds);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add (GDateTime *datetime,
GTimeSpan timespan);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_years (GDateTime *datetime,
gint years);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_months (GDateTime *datetime,
gint months);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_weeks (GDateTime *datetime,
gint weeks);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_days (GDateTime *datetime,
gint days);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_hours (GDateTime *datetime,
gint hours);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_minutes (GDateTime *datetime,
gint minutes);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_seconds (GDateTime *datetime,
gdouble seconds);
+GLIB_AVAILABLE_IN_ALL
G_GNUC_WARN_UNUSED_RESULT
GDateTime * g_date_time_add_full (GDateTime *datetime,
gint years,
@@ -167,48 +188,74 @@ GDateTime * g_date_time_add_full (GDateTi
gint minutes,
gdouble seconds);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_compare (gconstpointer dt1,
gconstpointer dt2);
+GLIB_AVAILABLE_IN_ALL
GTimeSpan g_date_time_difference (GDateTime *end,
GDateTime *begin);
+GLIB_AVAILABLE_IN_ALL
guint g_date_time_hash (gconstpointer datetime);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_time_equal (gconstpointer dt1,
gconstpointer dt2);
+GLIB_AVAILABLE_IN_ALL
void g_date_time_get_ymd (GDateTime *datetime,
gint *year,
gint *month,
gint *day);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_year (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_month (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_day_of_month (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_week_numbering_year (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_week_of_year (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_day_of_week (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_day_of_year (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_hour (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_minute (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_second (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint g_date_time_get_microsecond (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gdouble g_date_time_get_seconds (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gint64 g_date_time_to_unix (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_time_to_timeval (GDateTime *datetime,
GTimeVal *tv);
+GLIB_AVAILABLE_IN_ALL
GTimeSpan g_date_time_get_utc_offset (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_date_time_get_timezone_abbreviation (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gboolean g_date_time_is_daylight_savings (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_to_timezone (GDateTime *datetime,
GTimeZone *tz);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_to_local (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
GDateTime * g_date_time_to_utc (GDateTime *datetime);
+GLIB_AVAILABLE_IN_ALL
gchar * g_date_time_format (GDateTime *datetime,
const gchar *format) G_GNUC_MALLOC;
diff --git a/glib/glib/gdir.c b/glib/glib/gdir.c
index e89de89..4f17981 100644
--- a/glib/glib/gdir.c
+++ b/glib/glib/gdir.c
@@ -42,12 +42,13 @@
#include "gtestutils.h"
#include "glibintl.h"
-
#if defined (_MSC_VER) && !defined (HAVE_DIRENT_H)
#include "../build/win32/dirent/dirent.h"
#include "../build/win32/dirent/wdirent.c"
#endif
+#include "glib-private.h" /* g_dir_open_with_errno, g_dir_new_from_dirp */
+
/**
* GDir:
*
@@ -66,6 +67,57 @@ struct _GDir
#endif
};
+/*< private >
+ * g_dir_open_with_errno:
+ * @path: the path to the directory you are interested in.
+ * @flags: Currently must be set to 0. Reserved for future use.
+ *
+ * Opens a directory for reading.
+ *
+ * This function is equivalent to g_dir_open() except in the error case,
+ * errno will be set accordingly.
+ *
+ * This is useful if you want to construct your own error message.
+ *
+ * Returns: a newly allocated #GDir on success, or %NULL on failure,
+ * with errno set accordingly.
+ *
+ * Since: 2.38
+ */
+GDir *
+g_dir_open_with_errno (const gchar *path,
+ guint flags)
+{
+ GDir dir;
+#ifdef G_OS_WIN32
+ gint saved_errno;
+ wchar_t *wpath;
+#endif
+
+ g_return_val_if_fail (path != NULL, NULL);
+
+#ifdef G_OS_WIN32
+ wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL);
+
+ g_return_val_if_fail (wpath != NULL, NULL);
+
+ dir.wdirp = _wopendir (wpath);
+ saved_errno = errno;
+ g_free (wpath);
+ errno = saved_errno;
+
+ if (dir.wdirp == NULL)
+ return NULL;
+#else
+ dir.dirp = opendir (path);
+
+ if (dir.dirp == NULL)
+ return NULL;
+#endif
+
+ return g_memdup (&dir, sizeof dir);
+}
+
/**
* g_dir_open:
* @path: the path to the directory you are interested in. On Unix
@@ -88,67 +140,25 @@ g_dir_open (const gchar *path,
guint flags,
GError **error)
{
+ gint saved_errno;
GDir *dir;
- int errsv;
-#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);
+ dir = g_dir_open_with_errno (path, flags);
- if (wpath == NULL)
- return NULL;
-
- dir = g_new (GDir, 1);
-
- dir->wdirp = _wopendir (wpath);
- g_free (wpath);
-
- if (dir->wdirp)
- return dir;
-
- /* error case */
- errsv = errno;
-
- g_set_error (error,
- G_FILE_ERROR,
- g_file_error_from_errno (errsv),
- _("Error opening directory '%s': %s"),
- path, g_strerror (errsv));
-
- g_free (dir);
-
- return NULL;
-#else
- dir = g_new (GDir, 1);
-
- dir->dirp = opendir (path);
-
- if (dir->dirp)
- return dir;
-
- /* error case */
- errsv = errno;
+ if (dir == NULL)
+ {
+ gchar *utf8_path;
- utf8_path = g_filename_to_utf8 (path, -1,
- NULL, NULL, NULL);
+ saved_errno = errno;
- g_set_error (error,
- G_FILE_ERROR,
- g_file_error_from_errno (errsv),
- _("Error opening directory '%s': %s"),
- utf8_path, g_strerror (errsv));
+ utf8_path = g_filename_to_utf8 (path, -1, NULL, NULL, NULL);
- g_free (utf8_path);
- g_free (dir);
+ g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno),
+ _("Error opening directory '%s': %s"), utf8_path, g_strerror (saved_errno));
+ g_free (utf8_path);
+ }
- return NULL;
-#endif
+ return dir;
}
#if defined (G_OS_WIN32) && !defined (_WIN64)
@@ -181,6 +191,40 @@ g_dir_open (const gchar *path,
}
#endif
+/*< private >
+ * g_dir_new_from_dirp:
+ * @dirp: a #DIR* created by opendir() or fdopendir()
+ *
+ * Creates a #GDir object from the DIR object that is created using
+ * opendir() or fdopendir(). The created #GDir assumes ownership of the
+ * passed-in #DIR pointer.
+ *
+ * @dirp must not be %NULL.
+ *
+ * This function never fails.
+ *
+ * Returns: a newly allocated #GDir, which should be closed using
+ * g_dir_close().
+ *
+ * Since: 2.38
+ **/
+GDir *
+g_dir_new_from_dirp (gpointer dirp)
+{
+#ifdef G_OS_UNIX
+ GDir *dir;
+
+ g_return_val_if_fail (dirp != NULL, NULL);
+
+ dir = g_new (GDir, 1);
+ dir->dirp = dirp;
+
+ return dir;
+#else
+ g_assert_not_reached ();
+#endif
+}
+
/**
* g_dir_read_name:
* @dir: a #GDir* created by g_dir_open()
diff --git a/glib/glib/gdir.h b/glib/glib/gdir.h
index 79b3038..7b6ec1b 100644
--- a/glib/glib/gdir.h
+++ b/glib/glib/gdir.h
@@ -21,34 +21,46 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_DIR_H__
+#define __G_DIR_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_DIR_H__
-#define __G_DIR_H__
-
#include <glib/gerror.h>
+#ifdef G_OS_UNIX
+#include <dirent.h>
+#endif
+
G_BEGIN_DECLS
typedef struct _GDir GDir;
-#ifndef __GTK_DOC_IGNORE__
-#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
-#endif
-
+GLIB_AVAILABLE_IN_ALL
GDir * g_dir_open (const gchar *path,
guint flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_dir_read_name (GDir *dir);
+GLIB_AVAILABLE_IN_ALL
void g_dir_rewind (GDir *dir);
+GLIB_AVAILABLE_IN_ALL
void g_dir_close (GDir *dir);
+#ifdef G_OS_WIN32
+#define g_dir_open g_dir_open_utf8
+#define g_dir_read_name g_dir_read_name_utf8
+
+GLIB_AVAILABLE_IN_ALL
+GDir *g_dir_open_utf8 (const gchar *path,
+ guint flags,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+const gchar *g_dir_read_name_utf8 (GDir *dir);
+#endif /* G_OS_WIN32 */
+
G_END_DECLS
#endif /* __G_DIR_H__ */
diff --git a/glib/glib/gen-unicode-tables.pl b/glib/glib/gen-unicode-tables.pl
index f2b9237..d111d91 100755
--- a/glib/glib/gen-unicode-tables.pl
+++ b/glib/glib/gen-unicode-tables.pl
@@ -143,6 +143,7 @@ $FOLDING_MAPPING = 2;
'PO' => "G_UNICODE_BREAK_POSTFIX",
'PR' => "G_UNICODE_BREAK_PREFIX",
'QU' => "G_UNICODE_BREAK_QUOTATION",
+ 'RI' => "G_UNICODE_BREAK_REGIONAL_INDICATOR",
'SA' => "G_UNICODE_BREAK_COMPLEX_CONTEXT",
'SG' => "G_UNICODE_BREAK_SURROGATE",
'SP' => "G_UNICODE_BREAK_SPACE",
diff --git a/glib/glib/genviron.c b/glib/glib/genviron.c
index 59a8bbe..be2d6a5 100644
--- a/glib/glib/genviron.c
+++ b/glib/glib/genviron.c
@@ -40,6 +40,7 @@
#include <windows.h>
#endif
+#include "glib-private.h"
#include "gmem.h"
#include "gmessages.h"
#include "gstrfuncs.h"
@@ -466,7 +467,11 @@ g_getenv (const gchar *variable)
if (len == 0)
{
g_free (wname);
- return NULL;
+ if (GetLastError () == ERROR_ENVVAR_NOT_FOUND)
+ return NULL;
+
+ quark = g_quark_from_static_string ("");
+ return g_quark_to_string (quark);
}
else if (len == 1)
len = 2;
@@ -633,10 +638,15 @@ g_get_environ (void)
gint i, n;
strings = GetEnvironmentStringsW ();
- for (n = 0; strings[n]; n += wcslen (strings + n) + 1);
- result = g_new (char *, n + 1);
- for (i = 0; strings[i]; i += wcslen (strings + i) + 1)
- result[i] = g_utf16_to_utf8 (strings + i, -1, NULL, NULL, NULL);
+ for (n = 0, i = 0; strings[n]; i++)
+ n += wcslen (strings + n) + 1;
+
+ result = g_new (char *, i + 1);
+ for (n = 0, i = 0; strings[n]; i++)
+ {
+ result[i] = g_utf16_to_utf8 (strings + n, -1, NULL, NULL, NULL);
+ n += wcslen (strings + n) + 1;
+ }
FreeEnvironmentStringsW (strings);
result[i] = NULL;
diff --git a/glib/glib/genviron.h b/glib/glib/genviron.h
index c75c548..1fcc225 100644
--- a/glib/glib/genviron.h
+++ b/glib/glib/genviron.h
@@ -24,42 +24,57 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_ENVIRON_H__
+#define __G_ENVIRON_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ENVIRON_H__
-#define __G_ENVIRON_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
-#ifndef __GTK_DOC_IGNORE__
-#ifdef G_OS_WIN32
-#define g_getenv g_getenv_utf8
-#define g_setenv g_setenv_utf8
-#define g_unsetenv g_unsetenv_utf8
-#endif
-#endif
-
+GLIB_AVAILABLE_IN_ALL
const gchar * g_getenv (const gchar *variable);
+GLIB_AVAILABLE_IN_ALL
gboolean g_setenv (const gchar *variable,
const gchar *value,
gboolean overwrite);
+GLIB_AVAILABLE_IN_ALL
void g_unsetenv (const gchar *variable);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_listenv (void);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_get_environ (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_environ_getenv (gchar **envp,
const gchar *variable);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_environ_setenv (gchar **envp,
const gchar *variable,
const gchar *value,
gboolean overwrite) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gchar ** g_environ_unsetenv (gchar **envp,
const gchar *variable) G_GNUC_WARN_UNUSED_RESULT;
+#ifdef G_OS_WIN32
+#define g_getenv g_getenv_utf8
+#define g_setenv g_setenv_utf8
+#define g_unsetenv g_unsetenv_utf8
+
+GLIB_AVAILABLE_IN_ALL
+const gchar *g_getenv_utf8 (const gchar *variable);
+GLIB_AVAILABLE_IN_ALL
+gboolean g_setenv_utf8 (const gchar *variable,
+ const gchar *value,
+ gboolean overwrite);
+GLIB_AVAILABLE_IN_ALL
+void g_unsetenv_utf8 (const gchar *variable);
+#endif
+
G_END_DECLS
#endif /* __G_ENVIRON_H__ */
diff --git a/glib/glib/gerror.c b/glib/glib/gerror.c
index e6ce3c0..2adbdf8 100644
--- a/glib/glib/gerror.c
+++ b/glib/glib/gerror.c
@@ -645,6 +645,7 @@ g_clear_error (GError **err)
}
}
+G_GNUC_PRINTF(2, 0)
static void
g_error_add_prefix (gchar **string,
const gchar *format,
diff --git a/glib/glib/gerror.h b/glib/glib/gerror.h
index 6eb65fe..6224b87 100644
--- a/glib/glib/gerror.h
+++ b/glib/glib/gerror.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_ERROR_H__
+#define __G_ERROR_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_ERROR_H__
-#define __G_ERROR_H__
-
#include <stdarg.h>
#include <glib/gquark.h>
@@ -49,22 +49,28 @@ struct _GError
gchar *message;
};
+GLIB_AVAILABLE_IN_ALL
GError* g_error_new (GQuark domain,
gint code,
const gchar *format,
...) G_GNUC_PRINTF (3, 4);
+GLIB_AVAILABLE_IN_ALL
GError* g_error_new_literal (GQuark domain,
gint code,
const gchar *message);
+GLIB_AVAILABLE_IN_ALL
GError* g_error_new_valist (GQuark domain,
gint code,
const gchar *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(3, 0);
+GLIB_AVAILABLE_IN_ALL
void g_error_free (GError *error);
+GLIB_AVAILABLE_IN_ALL
GError* g_error_copy (const GError *error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_error_matches (const GError *error,
GQuark domain,
gint code);
@@ -72,12 +78,14 @@ gboolean g_error_matches (const GError *error,
/* if (err) *err = g_error_new(domain, code, format, ...), also has
* some sanity checks.
*/
+GLIB_AVAILABLE_IN_ALL
void g_set_error (GError **err,
GQuark domain,
gint code,
const gchar *format,
...) G_GNUC_PRINTF (4, 5);
+GLIB_AVAILABLE_IN_ALL
void g_set_error_literal (GError **err,
GQuark domain,
gint code,
@@ -85,18 +93,22 @@ void g_set_error_literal (GError **err,
/* if (dest) *dest = src; also has some sanity checks.
*/
+GLIB_AVAILABLE_IN_ALL
void g_propagate_error (GError **dest,
GError *src);
/* if (err && *err) { g_error_free(*err); *err = NULL; } */
+GLIB_AVAILABLE_IN_ALL
void g_clear_error (GError **err);
/* if (err) prefix the formatted string to the ->message */
+GLIB_AVAILABLE_IN_ALL
void g_prefix_error (GError **err,
const gchar *format,
...) G_GNUC_PRINTF (2, 3);
/* g_propagate_error then g_error_prefix on dest */
+GLIB_AVAILABLE_IN_ALL
void g_propagate_prefixed_error (GError **dest,
GError *src,
const gchar *format,
diff --git a/glib/glib/gfileutils.c b/glib/glib/gfileutils.c
index 0df9305..eb5baea 100644
--- a/glib/glib/gfileutils.c
+++ b/glib/glib/gfileutils.c
@@ -135,10 +135,10 @@
* 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
+ * 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'.
+ * 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
@@ -459,11 +459,7 @@ g_file_test (const gchar *filename,
#endif
}
-GQuark
-g_file_error_quark (void)
-{
- return g_quark_from_static_string ("g-file-error-quark");
-}
+G_DEFINE_QUARK (g-file-error-quark, g_file_error)
/**
* g_file_error_from_errno:
@@ -672,7 +668,7 @@ get_contents_stdio (const gchar *display_filename,
g_set_error (error,
G_FILE_ERROR,
G_FILE_ERROR_NOMEM,
- _("Could not allocate %lu bytes to read file \"%s\""),
+ g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file \"%s\"", "Could not allocate %lu bytes to read file \"%s\"", (gulong)total_allocated),
(gulong) total_allocated,
display_filename);
@@ -760,7 +756,7 @@ get_contents_regfile (const gchar *display_filename,
g_set_error (error,
G_FILE_ERROR,
G_FILE_ERROR_NOMEM,
- _("Could not allocate %lu bytes to read file \"%s\""),
+ g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file \"%s\"", "Could not allocate %lu bytes to read file \"%s\"", (gulong)alloc_size),
(gulong) alloc_size,
display_filename);
@@ -1008,6 +1004,49 @@ rename_file (const char *old_name,
return TRUE;
}
+static char *
+format_error_message (const gchar *filename,
+ const gchar *format_string) G_GNUC_FORMAT(2);
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
+static char *
+format_error_message (const gchar *filename,
+ const gchar *format_string)
+{
+ gint saved_errno = errno;
+ gchar *display_name;
+ gchar *msg;
+
+ display_name = g_filename_display_name (filename);
+ msg = g_strdup_printf (format_string, display_name, g_strerror (saved_errno));
+ g_free (display_name);
+
+ return msg;
+}
+
+#pragma GCC diagnostic pop
+
+/* format string must have two '%s':
+ *
+ * - the place for the filename
+ * - the place for the strerror
+ */
+static void
+set_file_error (GError **error,
+ const gchar *filename,
+ const gchar *format_string)
+
+{
+ int saved_errno = errno;
+ char *msg = format_error_message (filename, format_string);
+
+ g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno),
+ msg);
+ g_free (msg);
+}
+
static gchar *
write_to_temp_file (const gchar *contents,
gssize length,
@@ -1015,93 +1054,53 @@ write_to_temp_file (const gchar *contents,
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", dest_file);
errno = 0;
fd = g_mkstemp_full (tmp_name, O_RDWR | O_BINARY, 0666);
- save_errno = errno;
- display_name = g_filename_display_name (tmp_name);
-
if (fd == -1)
{
- 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));
-
+ set_file_error (err, tmp_name, _("Failed to create file '%s': %s"));
goto out;
}
- errno = 0;
- file = fdopen (fd, "wb");
- if (!file)
+#ifdef HAVE_FALLOCATE
+ if (length > 0)
{
- 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;
+ /* We do this on a 'best effort' basis... It may not be supported
+ * on the underlying filesystem.
+ */
+ (void) fallocate (fd, 0, 0, length);
}
-
- if (length > 0)
+#endif
+ while (length > 0)
{
- gsize n_written;
-
- errno = 0;
+ gssize s;
- n_written = fwrite (contents, 1, length, file);
+ s = write (fd, contents, length);
- 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));
+ if (s < 0)
+ {
+ if (errno == EINTR)
+ continue;
- fclose (file);
- g_unlink (tmp_name);
-
- goto out;
- }
- }
+ set_file_error (err, tmp_name, _("Failed to write file '%s': write() failed: %s"));
+ close (fd);
+ g_unlink (tmp_name);
- errno = 0;
- if (fflush (file) != 0)
- {
- save_errno = errno;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- _("Failed to write file '%s': fflush() failed: %s"),
- display_name,
- g_strerror (save_errno));
+ goto out;
+ }
- fclose (file);
- g_unlink (tmp_name);
-
- goto out;
+ g_assert (s <= length);
+
+ contents += s;
+ length -= s;
}
#ifdef BTRFS_SUPER_MAGIC
@@ -1117,7 +1116,7 @@ write_to_temp_file (const gchar *contents,
goto no_fsync;
}
#endif
-
+
#ifdef HAVE_FSYNC
{
struct stat statbuf;
@@ -1129,23 +1128,13 @@ write_to_temp_file (const gchar *contents,
* the new and the old file on some filesystems. (I.E. those that don't
* guarantee the data is written to the disk before the metadata.)
*/
- if (g_lstat (dest_file, &statbuf) == 0 &&
- statbuf.st_size > 0 &&
- fsync (fileno (file)) != 0)
+ if (g_lstat (dest_file, &statbuf) == 0 && statbuf.st_size > 0 && fsync (fd) != 0)
{
- save_errno = errno;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- _("Failed to write file '%s': fsync() failed: %s"),
- display_name,
- g_strerror (save_errno));
+ set_file_error (err, tmp_name, _("Failed to write file '%s': fsync() failed: %s"));
+ close (fd);
+ g_unlink (tmp_name);
- fclose (file);
- g_unlink (tmp_name);
-
- goto out;
+ goto out;
}
}
#endif
@@ -1153,30 +1142,20 @@ write_to_temp_file (const gchar *contents,
#ifdef BTRFS_SUPER_MAGIC
no_fsync:
#endif
-
- errno = 0;
- if (fclose (file) == EOF)
- {
- save_errno = errno;
-
- 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));
+ errno = 0;
+ if (!g_close (fd, err))
+ {
g_unlink (tmp_name);
-
+
goto out;
}
retval = g_strdup (tmp_name);
-
+
out:
g_free (tmp_name);
- g_free (display_name);
-
+
return retval;
}
@@ -1314,7 +1293,7 @@ g_file_set_contents (const gchar *filename,
* get_tmp_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.
*/
-typedef gint (*GTmpFileCallback) (gchar *, gint, gint);
+typedef gint (*GTmpFileCallback) (const gchar *, gint, gint);
static gint
get_tmp_file (gchar *tmpl,
@@ -1379,13 +1358,27 @@ get_tmp_file (gchar *tmpl,
return -1;
}
+/* Some GTmpFileCallback implementations.
+ *
+ * Note: we cannot use open() or g_open() directly because even though
+ * they appear compatible, they may be vararg functions and calling
+ * varargs functions through a non-varargs type is undefined.
+ */
static gint
-wrap_mkdir (gchar *tmpl,
- int flags G_GNUC_UNUSED,
- int mode)
+wrap_g_mkdir (const gchar *filename,
+ int flags G_GNUC_UNUSED,
+ int mode)
{
/* tmpl is in UTF-8 on Windows, thus use g_mkdir() */
- return g_mkdir (tmpl, mode);
+ return g_mkdir (filename, mode);
+}
+
+static gint
+wrap_g_open (const gchar *filename,
+ int flags,
+ int mode)
+{
+ return g_open (filename, flags, mode);
}
/**
@@ -1415,7 +1408,7 @@ gchar *
g_mkdtemp_full (gchar *tmpl,
gint mode)
{
- if (get_tmp_file (tmpl, wrap_mkdir, 0, mode) == -1)
+ if (get_tmp_file (tmpl, wrap_g_mkdir, 0, mode) == -1)
return NULL;
else
return tmpl;
@@ -1481,7 +1474,7 @@ g_mkstemp_full (gchar *tmpl,
gint mode)
{
/* tmpl is in UTF-8 on Windows, thus use g_open() */
- return get_tmp_file (tmpl, (GTmpFileCallback) g_open,
+ return get_tmp_file (tmpl, wrap_g_open,
flags | O_CREAT | O_EXCL, mode);
}
@@ -1631,7 +1624,7 @@ g_file_open_tmp (const gchar *tmpl,
gint result;
result = g_get_tmp_name (tmpl, &fulltemplate,
- (GTmpFileCallback) g_open,
+ wrap_g_open,
O_CREAT | O_EXCL | O_RDWR | O_BINARY,
0600,
error);
@@ -1677,7 +1670,7 @@ g_dir_make_tmp (const gchar *tmpl,
{
gchar *fulltemplate;
- if (g_get_tmp_name (tmpl, &fulltemplate, wrap_mkdir, 0, 0700, error) == -1)
+ if (g_get_tmp_name (tmpl, &fulltemplate, wrap_g_mkdir, 0, 0700, error) == -1)
return NULL;
else
return fulltemplate;
@@ -2601,13 +2594,21 @@ g_file_get_contents (const gchar *filename,
#undef g_mkstemp
+static gint
+wrap_libc_open (const gchar *filename,
+ int flags,
+ int mode)
+{
+ return open (filename, flags, mode);
+}
+
gint
g_mkstemp (gchar *tmpl)
{
/* This is the backward compatibility system codepage version,
* thus use normal open().
*/
- return get_tmp_file (tmpl, (GTmpFileCallback) open,
+ return get_tmp_file (tmpl, wrap_libc_open,
O_RDWR | O_CREAT | O_EXCL, 0600);
}
diff --git a/glib/glib/gfileutils.h b/glib/glib/gfileutils.h
index 7c2eb1d..93dbde3 100644
--- a/glib/glib/gfileutils.h
+++ b/glib/glib/gfileutils.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_FILEUTILS_H__
+#define __G_FILEUTILS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_FILEUTILS_H__
-#define __G_FILEUTILS_H__
-
#include <glib/gerror.h>
G_BEGIN_DECLS
@@ -73,29 +73,26 @@ typedef enum
G_FILE_TEST_EXISTS = 1 << 4
} GFileTest;
+GLIB_AVAILABLE_IN_ALL
GQuark g_file_error_quark (void);
/* So other code can generate a GFileError */
+GLIB_AVAILABLE_IN_ALL
GFileError g_file_error_from_errno (gint err_no);
-#ifndef __GTK_DOC_IGNORE__
-#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
-#endif
-
+GLIB_AVAILABLE_IN_ALL
gboolean g_file_test (const gchar *filename,
GFileTest test);
+GLIB_AVAILABLE_IN_ALL
gboolean g_file_get_contents (const gchar *filename,
gchar **contents,
gsize *length,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_file_set_contents (const gchar *filename,
const gchar *contents,
gssize length,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar *g_file_read_link (const gchar *filename,
GError **error);
@@ -107,12 +104,15 @@ gchar *g_mkdtemp_full (gchar *tmpl,
gint mode);
/* Wrapper / workalike for mkstemp() */
+GLIB_AVAILABLE_IN_ALL
gint g_mkstemp (gchar *tmpl);
+GLIB_AVAILABLE_IN_ALL
gint g_mkstemp_full (gchar *tmpl,
gint flags,
gint mode);
/* Wrappers for g_mkstemp and g_mkdtemp() */
+GLIB_AVAILABLE_IN_ALL
gint g_file_open_tmp (const gchar *tmpl,
gchar **name_used,
GError **error);
@@ -120,16 +120,21 @@ GLIB_AVAILABLE_IN_2_30
gchar *g_dir_make_tmp (const gchar *tmpl,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar *g_build_path (const gchar *separator,
const gchar *first_element,
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+GLIB_AVAILABLE_IN_ALL
gchar *g_build_pathv (const gchar *separator,
gchar **args) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_build_filename (const gchar *first_element,
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+GLIB_AVAILABLE_IN_ALL
gchar *g_build_filenamev (gchar **args) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gint g_mkdir_with_parents (const gchar *pathname,
gint mode);
@@ -155,7 +160,9 @@ gint g_mkdir_with_parents (const gchar *pathname,
#endif /* !G_OS_WIN32 */
+GLIB_AVAILABLE_IN_ALL
gboolean g_path_is_absolute (const gchar *file_name);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_path_skip_root (const gchar *file_name);
GLIB_DEPRECATED_FOR(g_path_get_basename)
@@ -164,16 +171,38 @@ const gchar *g_basename (const gchar *file_name);
#define g_dirname g_path_get_dirname
#endif
-#ifndef __GTK_DOC_IGNORE__
-#ifdef G_OS_WIN32
-#define g_get_current_dir g_get_current_dir_utf8
-#endif
-#endif
-
+GLIB_AVAILABLE_IN_ALL
gchar *g_get_current_dir (void);
+GLIB_AVAILABLE_IN_ALL
gchar *g_path_get_basename (const gchar *file_name) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_path_get_dirname (const gchar *file_name) G_GNUC_MALLOC;
+#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
+#define g_get_current_dir g_get_current_dir_utf8
+
+GLIB_AVAILABLE_IN_ALL
+gboolean g_file_test_utf8 (const gchar *filename,
+ GFileTest test);
+GLIB_AVAILABLE_IN_ALL
+gboolean g_file_get_contents_utf8 (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+gint g_mkstemp_utf8 (gchar *tmpl);
+GLIB_AVAILABLE_IN_ALL
+gint g_file_open_tmp_utf8 (const gchar *tmpl,
+ gchar **name_used,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+gchar *g_get_current_dir_utf8 (void);
+#endif /* G_OS_WIN32 */
+
G_END_DECLS
#endif /* __G_FILEUTILS_H__ */
diff --git a/glib/glib/ggettext.c b/glib/glib/ggettext.c
index c2d1ad5..56d752a 100644
--- a/glib/glib/ggettext.c
+++ b/glib/glib/ggettext.c
@@ -27,6 +27,8 @@
#include "config.h"
#include "ggettext.h"
+#include "glibintl.h"
+#include "glib-private.h"
#include "galloca.h"
#include "gthread.h"
@@ -333,10 +335,11 @@ _g_dgettext_should_translate (void)
* - If locale is "C", maybe user calls setlocale(LC_ALL,"") later.
* Continue with old behavior of translating.
*/
- if (0 != strcmp (default_domain, "messages") &&
+ if (!default_domain || !translator_comment || !translate_locale ||
+ (0 != strcmp (default_domain, "messages") &&
'\0' == *translator_comment &&
0 != strncmp (translate_locale, "en_", 3) &&
- 0 != strcmp (translate_locale, "C"))
+ 0 != strcmp (translate_locale, "C")))
should_translate = FALSE;
g_once_init_leave (&translate,
@@ -470,16 +473,21 @@ g_dngettext (const gchar *domain,
* easy-to-use form.
*
* 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.h</filename>. For use in a library, you must include
* <filename>glib/gi18n-lib.h</filename> <emphasis>after</emphasis> defining
* the GETTEXT_PACKAGE macro suitably for your library:
* |[
* &num;define GETTEXT_PACKAGE "gtk20"
* &num;include &lt;glib/gi18n-lib.h&gt;
* ]|
- * Note that you also have to call setlocale() and textdomain() (as well as
- * bindtextdomain() and bind_textdomain_codeset()) early on in your main()
- * to make gettext() work.
+ * For an application, note that you also have to call bindtextdomain(),
+ * bind_textdomain_codeset(), textdomain() and setlocale() early on in your
+ * main() to make gettext() work.
+ *
+ * For a library, you only have to call bindtextdomain() and
+ * bind_textdomain_codeset() in your initialization function. If your library
+ * doesn't have an initialization function, you can call the functions before
+ * the first translated message.
*
* The gettext manual covers details of how to set up message extraction
* with xgettext.
diff --git a/glib/glib/ggettext.h b/glib/glib/ggettext.h
index 54bbaa8..e1ef576 100644
--- a/glib/glib/ggettext.h
+++ b/glib/glib/ggettext.h
@@ -24,32 +24,38 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_GETTEXT_H__
+#define __G_GETTEXT_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_GETTEXT_H__
-#define __G_GETTEXT_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
const gchar *g_strip_context (const gchar *msgid,
const gchar *msgval) G_GNUC_FORMAT(1);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_dgettext (const gchar *domain,
const gchar *msgid) G_GNUC_FORMAT(2);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_dcgettext (const gchar *domain,
const gchar *msgid,
gint category) G_GNUC_FORMAT(2);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_dngettext (const gchar *domain,
const gchar *msgid,
const gchar *msgid_plural,
gulong n) G_GNUC_FORMAT(3);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_dpgettext (const gchar *domain,
const gchar *msgctxtid,
gsize msgidoffset) G_GNUC_FORMAT(2);
+GLIB_AVAILABLE_IN_ALL
const gchar *g_dpgettext2 (const gchar *domain,
const gchar *context,
const gchar *msgid) G_GNUC_FORMAT(3);
diff --git a/glib/glib/ghash.c b/glib/glib/ghash.c
index 3fc5b5a..9150f32 100644
--- a/glib/glib/ghash.c
+++ b/glib/glib/ghash.c
@@ -82,50 +82,14 @@
*
* To destroy a #GHashTable use g_hash_table_destroy().
*
- * <example>
- * <title>Using a GHashTable as a set</title>
- * <para>
- * A common use-case for hash tables is to store information about
- * a set of keys, without associating any particular value with each
+ * A common use-case for hash tables is to store information about a
+ * set of keys, without associating any particular value with each
* key. GHashTable optimizes one way of doing so: If you store only
* key-value pairs where key == value, then GHashTable does not
* allocate memory to store the values, which can be a considerable
- * space saving, if your set is large.
- * </para>
- * <programlisting>
- * GHashTable *
- * set_new (GHashFunc hash_func,
- * GEqualFunc equal_func,
- * GDestroyNotify destroy)
- * {
- * return g_hash_table_new_full (hash_func, equal_func, destroy, NULL);
- * }
- *
- * void
- * set_add (GHashTable *set,
- * gpointer element)
- * {
- * g_hash_table_replace (set, element, element);
- * }
- *
- * gboolean
- * set_contains (GHashTable *set,
- * gpointer element)
- * {
- * return g_hash_table_lookup_extended (set, element, NULL, NULL);
- * }
- *
- * gboolean
- * set_remove (GHashTable *set,
- * gpointer element)
- * {
- * return g_hash_table_remove (set, element);
- * }
- * </programlisting>
- * </example>
- *
- * As of version 2.32, there is also a g_hash_table_add() function to
- * add a key to a #GHashTable that is being used as a set.
+ * space saving, if your set is large. The functions
+ * g_hash_table_add() and g_hash_table_contains() are designed to be
+ * used when using #GHashTable this way.
*/
/**
@@ -870,34 +834,72 @@ static void
g_hash_table_insert_node (GHashTable *hash_table,
guint node_index,
guint key_hash,
- gpointer key,
- gpointer value,
+ gpointer new_key,
+ gpointer new_value,
gboolean keep_new_key,
gboolean reusing_key)
{
+ gboolean already_exists;
guint old_hash;
- gpointer old_key;
- gpointer old_value;
-
- if (G_UNLIKELY (hash_table->keys == hash_table->values && key != value))
- hash_table->values = g_memdup (hash_table->keys, sizeof (gpointer) * hash_table->size);
+ gpointer key_to_free = NULL;
+ gpointer value_to_free = NULL;
old_hash = hash_table->hashes[node_index];
- old_key = hash_table->keys[node_index];
- old_value = hash_table->values[node_index];
-
- if (HASH_IS_REAL (old_hash))
+ already_exists = HASH_IS_REAL (old_hash);
+
+ /* Proceed in three steps. First, deal with the key because it is the
+ * most complicated. Then consider if we need to split the table in
+ * two (because writing the value will result in the set invariant
+ * becoming broken). Then deal with the value.
+ *
+ * There are three cases for the key:
+ *
+ * - entry already exists in table, reusing key:
+ * free the just-passed-in new_key and use the existing value
+ *
+ * - entry already exists in table, not reusing key:
+ * free the entry in the table, use the new key
+ *
+ * - entry not already in table:
+ * use the new key, free nothing
+ *
+ * We update the hash at the same time...
+ */
+ if (already_exists)
{
+ /* Note: we must record the old value before writing the new key
+ * because we might change the value in the event that the two
+ * arrays are shared.
+ */
+ value_to_free = hash_table->values[node_index];
+
if (keep_new_key)
- hash_table->keys[node_index] = key;
- hash_table->values[node_index] = value;
+ {
+ key_to_free = hash_table->keys[node_index];
+ hash_table->keys[node_index] = new_key;
+ }
+ else
+ key_to_free = new_key;
}
else
{
- hash_table->keys[node_index] = key;
- hash_table->values[node_index] = value;
hash_table->hashes[node_index] = key_hash;
+ hash_table->keys[node_index] = new_key;
+ }
+
+ /* Step two: check if the value that we are about to write to the
+ * table is the same as the key in the same position. If it's not,
+ * split the table.
+ */
+ if (G_UNLIKELY (hash_table->keys == hash_table->values && hash_table->keys[node_index] != new_value))
+ hash_table->values = g_memdup (hash_table->keys, sizeof (gpointer) * hash_table->size);
+ /* Step 3: Actually do the write */
+ hash_table->values[node_index] = new_value;
+
+ /* Now, the bookkeeping... */
+ if (!already_exists)
+ {
hash_table->nnodes++;
if (HASH_IS_UNUSED (old_hash))
@@ -912,12 +914,12 @@ g_hash_table_insert_node (GHashTable *hash_table,
#endif
}
- if (HASH_IS_REAL (old_hash))
+ if (already_exists)
{
if (hash_table->key_destroy_func && !reusing_key)
- hash_table->key_destroy_func (keep_new_key ? old_key : key);
+ (* hash_table->key_destroy_func) (key_to_free);
if (hash_table->value_destroy_func)
- hash_table->value_destroy_func (old_value);
+ (* hash_table->value_destroy_func) (value_to_free);
}
}
@@ -1615,8 +1617,8 @@ g_hash_table_size (GHashTable *hash_table)
* 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.
+ * Retrieves every key inside @hash_table. The returned data is valid
+ * until changes to the hash release those keys.
*
* Return value: a #GList containing all the keys inside the hash
* table. The content of the list is owned by the hash table and
diff --git a/glib/glib/ghash.h b/glib/glib/ghash.h
index 3eb8912..19054bb 100644
--- a/glib/glib/ghash.h
+++ b/glib/glib/ghash.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_HASH_H__
+#define __G_HASH_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_HASH_H__
-#define __G_HASH_H__
-
#include <glib/gtypes.h>
#include <glib/glist.h>
@@ -55,64 +55,91 @@ struct _GHashTableIter
gpointer dummy6;
};
+GLIB_AVAILABLE_IN_ALL
GHashTable* g_hash_table_new (GHashFunc hash_func,
GEqualFunc key_equal_func);
+GLIB_AVAILABLE_IN_ALL
GHashTable* g_hash_table_new_full (GHashFunc hash_func,
GEqualFunc key_equal_func,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_destroy (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_insert (GHashTable *hash_table,
gpointer key,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_replace (GHashTable *hash_table,
gpointer key,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_add (GHashTable *hash_table,
gpointer key);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hash_table_remove (GHashTable *hash_table,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_remove_all (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hash_table_steal (GHashTable *hash_table,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_steal_all (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
gpointer g_hash_table_lookup (GHashTable *hash_table,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hash_table_contains (GHashTable *hash_table,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hash_table_lookup_extended (GHashTable *hash_table,
gconstpointer lookup_key,
gpointer *orig_key,
gpointer *value);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gpointer g_hash_table_find (GHashTable *hash_table,
GHRFunc predicate,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
guint g_hash_table_foreach_remove (GHashTable *hash_table,
GHRFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
guint g_hash_table_foreach_steal (GHashTable *hash_table,
GHRFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
guint g_hash_table_size (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
GList * g_hash_table_get_keys (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
GList * g_hash_table_get_values (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_iter_init (GHashTableIter *iter,
GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hash_table_iter_next (GHashTableIter *iter,
gpointer *key,
gpointer *value);
+GLIB_AVAILABLE_IN_ALL
GHashTable* g_hash_table_iter_get_hash_table (GHashTableIter *iter);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_iter_remove (GHashTableIter *iter);
GLIB_AVAILABLE_IN_2_30
void g_hash_table_iter_replace (GHashTableIter *iter,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_iter_steal (GHashTableIter *iter);
+GLIB_AVAILABLE_IN_ALL
GHashTable* g_hash_table_ref (GHashTable *hash_table);
+GLIB_AVAILABLE_IN_ALL
void g_hash_table_unref (GHashTable *hash_table);
#ifndef G_DISABLE_DEPRECATED
@@ -122,23 +149,33 @@ void g_hash_table_unref (GHashTable *hash_table);
/* Hash Functions
*/
+GLIB_AVAILABLE_IN_ALL
gboolean g_str_equal (gconstpointer v1,
gconstpointer v2);
+GLIB_AVAILABLE_IN_ALL
guint g_str_hash (gconstpointer v);
+GLIB_AVAILABLE_IN_ALL
gboolean g_int_equal (gconstpointer v1,
gconstpointer v2);
+GLIB_AVAILABLE_IN_ALL
guint g_int_hash (gconstpointer v);
+GLIB_AVAILABLE_IN_ALL
gboolean g_int64_equal (gconstpointer v1,
gconstpointer v2);
+GLIB_AVAILABLE_IN_ALL
guint g_int64_hash (gconstpointer v);
+GLIB_AVAILABLE_IN_ALL
gboolean g_double_equal (gconstpointer v1,
gconstpointer v2);
+GLIB_AVAILABLE_IN_ALL
guint g_double_hash (gconstpointer v);
+GLIB_AVAILABLE_IN_ALL
guint g_direct_hash (gconstpointer v) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_direct_equal (gconstpointer v1,
gconstpointer v2) G_GNUC_CONST;
diff --git a/glib/glib/ghmac.h b/glib/glib/ghmac.h
index d03d71f..94bc427 100644
--- a/glib/glib/ghmac.h
+++ b/glib/glib/ghmac.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_HMAC_H__
+#define __G_HMAC_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_HMAC_H__
-#define __G_HMAC_H__
-
#include <glib/gtypes.h>
#include "gchecksum.h"
diff --git a/glib/glib/ghook.h b/glib/glib/ghook.h
index e7292ea..45e1e27 100644
--- a/glib/glib/ghook.h
+++ b/glib/glib/ghook.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_HOOK_H__
+#define __G_HOOK_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_HOOK_H__
-#define __G_HOOK_H__
-
#include <glib/gmem.h>
G_BEGIN_DECLS
@@ -103,54 +103,73 @@ struct _GHook
/* --- prototypes --- */
/* callback maintenance functions */
+GLIB_AVAILABLE_IN_ALL
void g_hook_list_init (GHookList *hook_list,
guint hook_size);
+GLIB_AVAILABLE_IN_ALL
void g_hook_list_clear (GHookList *hook_list);
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_alloc (GHookList *hook_list);
+GLIB_AVAILABLE_IN_ALL
void g_hook_free (GHookList *hook_list,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
GHook * g_hook_ref (GHookList *hook_list,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
void g_hook_unref (GHookList *hook_list,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hook_destroy (GHookList *hook_list,
gulong hook_id);
+GLIB_AVAILABLE_IN_ALL
void g_hook_destroy_link (GHookList *hook_list,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
void g_hook_prepend (GHookList *hook_list,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
void g_hook_insert_before (GHookList *hook_list,
GHook *sibling,
GHook *hook);
+GLIB_AVAILABLE_IN_ALL
void g_hook_insert_sorted (GHookList *hook_list,
GHook *hook,
GHookCompareFunc func);
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_get (GHookList *hook_list,
gulong hook_id);
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_find (GHookList *hook_list,
gboolean need_valids,
GHookFindFunc func,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_find_data (GHookList *hook_list,
gboolean need_valids,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_find_func (GHookList *hook_list,
gboolean need_valids,
gpointer func);
+GLIB_AVAILABLE_IN_ALL
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 */
+GLIB_AVAILABLE_IN_ALL
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
*/
+GLIB_AVAILABLE_IN_ALL
GHook* g_hook_next_valid (GHookList *hook_list,
GHook *hook,
gboolean may_be_in_call);
/* GHookCompareFunc implementation to insert hooks sorted by their id */
+GLIB_AVAILABLE_IN_ALL
gint g_hook_compare_ids (GHook *new_hook,
GHook *sibling);
/* convenience macros */
@@ -158,19 +177,23 @@ gint g_hook_compare_ids (GHook *new_hook,
g_hook_insert_before ((hook_list), NULL, (hook))
/* invoke all valid hooks with the (*GHookFunc) signature.
*/
+GLIB_AVAILABLE_IN_ALL
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.
*/
+GLIB_AVAILABLE_IN_ALL
void g_hook_list_invoke_check (GHookList *hook_list,
gboolean may_recurse);
/* invoke a marshaller on all valid hooks.
*/
+GLIB_AVAILABLE_IN_ALL
void g_hook_list_marshal (GHookList *hook_list,
gboolean may_recurse,
GHookMarshaller marshaller,
gpointer marshal_data);
+GLIB_AVAILABLE_IN_ALL
void g_hook_list_marshal_check (GHookList *hook_list,
gboolean may_recurse,
GHookCheckMarshaller marshaller,
diff --git a/glib/glib/ghostutils.h b/glib/glib/ghostutils.h
index 0349da3..dfb64e5 100644
--- a/glib/glib/ghostutils.h
+++ b/glib/glib/ghostutils.h
@@ -17,22 +17,27 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_HOST_UTILS_H__
+#define __G_HOST_UTILS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_HOST_UTILS_H__
-#define __G_HOST_UTILS_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
gboolean g_hostname_is_non_ascii (const gchar *hostname);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hostname_is_ascii_encoded (const gchar *hostname);
+GLIB_AVAILABLE_IN_ALL
gboolean g_hostname_is_ip_address (const gchar *hostname);
+GLIB_AVAILABLE_IN_ALL
gchar *g_hostname_to_ascii (const gchar *hostname);
+GLIB_AVAILABLE_IN_ALL
gchar *g_hostname_to_unicode (const gchar *hostname);
G_END_DECLS
diff --git a/glib/glib/giochannel.c b/glib/glib/giochannel.c
index 32099f7..84e9d76 100644
--- a/glib/glib/giochannel.c
+++ b/glib/glib/giochannel.c
@@ -689,12 +689,13 @@ g_io_add_watch_full (GIOChannel *channel,
* @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
*
* 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.
+ *
+ * Returns: the function should return %FALSE if the event source
+ * should be removed
**/
/**
* GIOCondition:
@@ -823,9 +824,11 @@ g_io_channel_error_from_errno (gint en)
#endif
#ifdef EOVERFLOW
+#if EOVERFLOW != EFBIG
case EOVERFLOW:
return G_IO_CHANNEL_ERROR_OVERFLOW;
#endif
+#endif
#ifdef EPIPE
case EPIPE:
@@ -878,10 +881,10 @@ g_io_channel_get_buffer_size (GIOChannel *channel)
/**
* g_io_channel_set_line_term:
* @channel: a #GIOChannel
- * @line_term: The line termination string. Use %NULL for autodetect.
- * Autodetection breaks on "\n", "\r\n", "\r", "\0", and
- * the Unicode paragraph separator. Autodetection should
- * not be used for anything other than file-based channels.
+ * @line_term: (allow-none): The line termination string. Use %NULL for
+ * autodetect. Autodetection breaks on "\n", "\r\n", "\r", "\0",
+ * and the Unicode paragraph separator. Autodetection 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 embedded nuls.
@@ -1282,7 +1285,7 @@ g_io_channel_get_buffered (GIOChannel *channel)
/**
* g_io_channel_set_encoding:
* @channel: a #GIOChannel
- * @encoding: the encoding type
+ * @encoding: (allow-none): the encoding type
* @error: location to store an error of type #GConvertError
*
* Sets the encoding for the input/output of the channel.
@@ -1649,12 +1652,12 @@ reencode:
/**
* g_io_channel_read_line:
* @channel: a #GIOChannel
- * @str_return: The line read from the #GIOChannel, including the
+ * @str_return: (out): 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: (allow-none): location to store length of the read data, or %NULL
- * @terminator_pos: (allow-none): location to store position of line terminator, or %NULL
+ * @length: (allow-none) (out): location to store length of the read data, or %NULL
+ * @terminator_pos: (allow-none) (out): location to store position of line terminator, or %NULL
* @error: A location to return an error of type #GConvertError
* or #GIOChannelError
*
@@ -1913,12 +1916,12 @@ done:
/**
* 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
+ * @str_return: (out) (array length=length) (element-type guint8): 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: (out): location to store length of the data
* @error: location to return an error of type #GConvertError
* or #GIOChannelError
*
@@ -1994,11 +1997,12 @@ g_io_channel_read_to_end (GIOChannel *channel,
/**
* 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
+ * @buf: (out caller-allocates) (array length=count) (element-type guint8):
+ * a buffer to read data into
+ * @count: (in): 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: (allow-none): The number of bytes read. This may be
+ * @bytes_read: (allow-none) (out): 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.
@@ -2113,7 +2117,7 @@ g_io_channel_read_chars (GIOChannel *channel,
/**
* g_io_channel_read_unichar:
* @channel: a #GIOChannel
- * @thechar: a location to return a character
+ * @thechar: (out): a location to return a character
* @error: a location to return an error of type #GConvertError
* or #GIOChannelError
*
@@ -2174,10 +2178,10 @@ g_io_channel_read_unichar (GIOChannel *channel,
/**
* g_io_channel_write_chars:
* @channel: a #GIOChannel
- * @buf: a buffer to write data from
+ * @buf: (array) (element-type guint8): 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
+ * @bytes_written: (out): 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
@@ -2580,8 +2584,5 @@ g_io_channel_write_unichar (GIOChannel *channel,
*
* Error codes returned by #GIOChannel operations.
**/
-GQuark
-g_io_channel_error_quark (void)
-{
- return g_quark_from_static_string ("g-io-channel-error-quark");
-}
+
+G_DEFINE_QUARK (g-io-channel-error-quark, g_io_channel_error)
diff --git a/glib/glib/giochannel.h b/glib/glib/giochannel.h
index 8d3f2d7..75fa1ef 100644
--- a/glib/glib/giochannel.h
+++ b/glib/glib/giochannel.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_IOCHANNEL_H__
+#define __G_IOCHANNEL_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_IOCHANNEL_H__
-#define __G_IOCHANNEL_H__
-
#include <glib/gconvert.h>
#include <glib/gmain.h>
#include <glib/gstring.h>
@@ -83,31 +83,19 @@ typedef enum
G_SEEK_END
} GSeekType;
-typedef enum /*< flags >*/
-{
- 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_WRITABLE = 1 << 3, /* Read only flag */
+ G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Misspelling in 2.29.10 and earlier */
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;
-/* Misspelling in enum in 2.29.10 and earlier */
-#define G_IO_FLAG_IS_WRITEABLE (G_IO_FLAG_IS_WRITABLE)
-
struct _GIOChannel
{
/*< private >*/
@@ -169,11 +157,14 @@ struct _GIOFuncs
GIOFlags (*io_get_flags) (GIOChannel *channel);
};
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_init (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOChannel *g_io_channel_ref (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_unref (GIOChannel *channel);
-GLIB_DEPRECATED_FOR(g_io_channel_read_for)
+GLIB_DEPRECATED_FOR(g_io_channel_read_chars)
GIOError g_io_channel_read (GIOChannel *channel,
gchar *buf,
gsize count,
@@ -193,17 +184,21 @@ GIOError g_io_channel_seek (GIOChannel *channel,
GLIB_DEPRECATED_FOR(g_io_channel_shutdown)
void g_io_channel_close (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_shutdown (GIOChannel *channel,
gboolean flush,
GError **err);
+GLIB_AVAILABLE_IN_ALL
guint g_io_add_watch_full (GIOChannel *channel,
gint priority,
GIOCondition condition,
GIOFunc func,
gpointer user_data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
GSource * g_io_create_watch (GIOChannel *channel,
GIOCondition condition);
+GLIB_AVAILABLE_IN_ALL
guint g_io_add_watch (GIOChannel *channel,
GIOCondition condition,
GIOFunc func,
@@ -212,77 +207,98 @@ guint g_io_add_watch (GIOChannel *channel,
/* character encoding conversion involved functions.
*/
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_set_buffer_size (GIOChannel *channel,
gsize size);
+GLIB_AVAILABLE_IN_ALL
gsize g_io_channel_get_buffer_size (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_set_flags (GIOChannel *channel,
GIOFlags flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOFlags g_io_channel_get_flags (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_set_line_term (GIOChannel *channel,
const gchar *line_term,
gint length);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_io_channel_get_line_term (GIOChannel *channel,
gint *length);
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_set_buffered (GIOChannel *channel,
gboolean buffered);
+GLIB_AVAILABLE_IN_ALL
gboolean g_io_channel_get_buffered (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_set_encoding (GIOChannel *channel,
const gchar *encoding,
GError **error);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_io_channel_get_encoding (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_set_close_on_unref (GIOChannel *channel,
gboolean do_close);
+GLIB_AVAILABLE_IN_ALL
gboolean g_io_channel_get_close_on_unref (GIOChannel *channel);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_flush (GIOChannel *channel,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_read_line (GIOChannel *channel,
gchar **str_return,
gsize *length,
gsize *terminator_pos,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_read_line_string (GIOChannel *channel,
GString *buffer,
gsize *terminator_pos,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_read_to_end (GIOChannel *channel,
gchar **str_return,
gsize *length,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_read_chars (GIOChannel *channel,
gchar *buf,
gsize count,
gsize *bytes_read,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_read_unichar (GIOChannel *channel,
gunichar *thechar,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_write_chars (GIOChannel *channel,
const gchar *buf,
gssize count,
gsize *bytes_written,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GIOStatus g_io_channel_write_unichar (GIOChannel *channel,
gunichar thechar,
GError **error);
+GLIB_AVAILABLE_IN_ALL
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
-
+GLIB_AVAILABLE_IN_ALL
GIOChannel* g_io_channel_new_file (const gchar *filename,
const gchar *mode,
GError **error);
/* Error handling */
+GLIB_AVAILABLE_IN_ALL
GQuark g_io_channel_error_quark (void);
+GLIB_AVAILABLE_IN_ALL
GIOChannelError g_io_channel_error_from_errno (gint en);
/* On Unix, IO channels created with this function for any file
@@ -303,7 +319,9 @@ GIOChannelError g_io_channel_error_from_errno (gint en);
* corresponding concept is file HANDLE. There isn't as of yet a way to
* get GIOChannels for Win32 file HANDLEs.
*/
+GLIB_AVAILABLE_IN_ALL
GIOChannel* g_io_channel_unix_new (int fd);
+GLIB_AVAILABLE_IN_ALL
gint g_io_channel_unix_get_fd (GIOChannel *channel);
@@ -324,6 +342,7 @@ GLIB_VAR GSourceFuncs g_io_watch_funcs;
* from the underlying file descriptor. For SOCKETs, it is possible to call
* recv().
*/
+GLIB_AVAILABLE_IN_ALL
void g_io_channel_win32_make_pollfd (GIOChannel *channel,
GIOCondition condition,
GPollFD *fd);
@@ -331,6 +350,7 @@ void g_io_channel_win32_make_pollfd (GIOChannel *channel,
/* 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.
*/
+GLIB_AVAILABLE_IN_ALL
gint g_io_channel_win32_poll (GPollFD *fds,
gint n_fds,
gint timeout_);
@@ -341,8 +361,10 @@ gint g_io_channel_win32_poll (GPollFD *fds,
* pointer, like the guint in the traditional prototype. We can't use
* intptr_t as that is not portable enough.
*/
+GLIB_AVAILABLE_IN_ALL
GIOChannel *g_io_channel_win32_new_messages (gsize hwnd);
#else
+GLIB_AVAILABLE_IN_ALL
GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
#endif
@@ -355,9 +377,11 @@ GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
* the file descriptor should be done by this internal GLib
* thread. Your code should call only g_io_channel_read_chars().
*/
+GLIB_AVAILABLE_IN_ALL
GIOChannel* g_io_channel_win32_new_fd (gint fd);
/* Get the C runtime file descriptor of a channel. */
+GLIB_AVAILABLE_IN_ALL
gint g_io_channel_win32_get_fd (GIOChannel *channel);
/* Create an IO channel for a winsock socket. The parameter should be
@@ -365,8 +389,25 @@ gint g_io_channel_win32_get_fd (GIOChannel *channel);
* you can use normal recv() or recvfrom() on sockets even if GLib
* is polling them.
*/
+GLIB_AVAILABLE_IN_ALL
GIOChannel *g_io_channel_win32_new_socket (gint socket);
+GLIB_DEPRECATED_FOR(g_io_channel_win32_new_socket)
+GIOChannel *g_io_channel_win32_new_stream_socket (gint socket);
+
+GLIB_AVAILABLE_IN_ALL
+void g_io_channel_win32_set_debug (GIOChannel *channel,
+ gboolean flag);
+
+#endif
+
+#ifdef G_OS_WIN32
+#define g_io_channel_new_file g_io_channel_new_file_utf8
+
+GLIB_AVAILABLE_IN_ALL
+GIOChannel *g_io_channel_new_file_utf8 (const gchar *filename,
+ const gchar *mode,
+ GError **error);
#endif
G_END_DECLS
diff --git a/glib/glib/giounix.c b/glib/glib/giounix.c
index 969c3cc..517e36b 100644
--- a/glib/glib/giounix.c
+++ b/glib/glib/giounix.c
@@ -42,6 +42,7 @@
#include <errno.h>
#include <string.h>
#include <fcntl.h>
+#include <glib/gstdio.h>
#include "giochannel.h"
@@ -525,12 +526,7 @@ g_io_channel_new_file (const gchar *filename,
create_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
- do
- {
- fid = open (filename, flags, create_mode);
- }
- while (fid == -1 && errno == EINTR);
-
+ fid = g_open (filename, flags, create_mode);
if (fid == -1)
{
int err = errno;
@@ -588,7 +584,6 @@ g_io_channel_new_file (const gchar *filename,
/**
* g_io_channel_unix_new:
* @fd: a file descriptor.
- * @Returns: a new #GIOChannel.
*
* Creates a new #GIOChannel given a file descriptor. On UNIX systems
* this works for plain files, pipes, and sockets.
@@ -610,6 +605,8 @@ g_io_channel_new_file (const gchar *filename,
* 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.
+ *
+ * Returns: a new #GIOChannel.
**/
GIOChannel *
g_io_channel_unix_new (gint fd)
@@ -643,12 +640,13 @@ g_io_channel_unix_new (gint fd)
/**
* g_io_channel_unix_get_fd:
* @channel: a #GIOChannel, created with g_io_channel_unix_new().
- * @Returns: the file descriptor of the #GIOChannel.
*
* Returns the file descriptor of the #GIOChannel.
*
* On Windows this function returns the file descriptor or socket of
* the #GIOChannel.
+ *
+ * Returns: the file descriptor of the #GIOChannel.
**/
gint
g_io_channel_unix_get_fd (GIOChannel *channel)
diff --git a/glib/glib/giowin32.c b/glib/glib/giowin32.c
index d39a4b2..72cd84b 100644
--- a/glib/glib/giowin32.c
+++ b/glib/glib/giowin32.c
@@ -1625,7 +1625,8 @@ g_io_channel_new_file (const gchar *filename,
MODE_W = 1 << 1,
MODE_A = 1 << 2,
MODE_PLUS = 1 << 3,
- } mode_num;
+ };
+ int mode_num;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (mode != NULL, NULL);
@@ -1972,12 +1973,13 @@ static GIOFuncs win32_channel_sock_funcs = {
/**
* g_io_channel_win32_new_messages:
* @hwnd: a window handle.
- * @Returns: a new #GIOChannel.
*
* Creates a new #GIOChannel given a window handle on Windows.
*
* This function creates a #GIOChannel that can be used to poll for
* Windows messages for the window in question.
+ *
+ * Returns: a new #GIOChannel.
**/
GIOChannel *
#if GLIB_SIZEOF_VOID_P == 8
@@ -2045,7 +2047,6 @@ g_io_channel_win32_new_fd_internal (gint fd,
/**
* g_io_channel_win32_new_fd:
* @fd: a C library file descriptor.
- * @Returns: a new #GIOChannel.
*
* Creates a new #GIOChannel given a file descriptor on Windows. This
* works for file descriptors from the C runtime.
@@ -2069,6 +2070,8 @@ g_io_channel_win32_new_fd_internal (gint fd,
* thread. Your code should call only g_io_channel_read().
*
* This function is available only in GLib on Windows.
+ *
+ * Returns: a new #GIOChannel.
**/
GIOChannel *
g_io_channel_win32_new_fd (gint fd)
@@ -2095,7 +2098,6 @@ g_io_channel_win32_get_fd (GIOChannel *channel)
/**
* g_io_channel_win32_new_socket:
* @socket: a Winsock socket
- * @Returns: a new #GIOChannel
*
* Creates a new #GIOChannel given a socket on Windows.
*
@@ -2105,6 +2107,8 @@ g_io_channel_win32_get_fd (GIOChannel *channel)
* 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.
+ *
+ * Returns: a new #GIOChannel
**/
GIOChannel *
g_io_channel_win32_new_socket (int socket)
diff --git a/glib/glib/gkeyfile.c b/glib/glib/gkeyfile.c
index 98adf99..ae20689 100644
--- a/glib/glib/gkeyfile.c
+++ b/glib/glib/gkeyfile.c
@@ -42,7 +42,9 @@
#ifdef G_OS_WIN32
#include <io.h>
+#undef fstat
#define fstat(a,b) _fstati64(a,b)
+#undef stat
#define stat _stati64
#ifndef S_ISREG
@@ -554,12 +556,7 @@ static void g_key_file_parse_data (GKeyFile
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");
-}
+G_DEFINE_QUARK (g-key-file-error-quark, g_key_file_error)
static void
g_key_file_init (GKeyFile *key_file)
@@ -861,7 +858,7 @@ g_key_file_load_from_file (GKeyFile *key_file,
/**
* g_key_file_load_from_data:
* @key_file: an empty #GKeyFile struct
- * @data: (length length): key file loaded in memory
+ * @data: key file loaded in memory
* @length: the length of @data in bytes (or -1 if data is nul-terminated)
* @flags: flags from #GKeyFileFlags
* @error: return location for a #GError, or %NULL
diff --git a/glib/glib/gkeyfile.h b/glib/glib/gkeyfile.h
index 998bb7a..b37070e 100644
--- a/glib/glib/gkeyfile.h
+++ b/glib/glib/gkeyfile.h
@@ -20,13 +20,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_KEY_FILE_H__
+#define __G_KEY_FILE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_KEY_FILE_H__
-#define __G_KEY_FILE_H__
-
#include <glib/gerror.h>
G_BEGIN_DECLS
@@ -43,6 +43,7 @@ typedef enum
#define G_KEY_FILE_ERROR g_key_file_error_quark()
+GLIB_AVAILABLE_IN_ALL
GQuark g_key_file_error_quark (void);
typedef struct _GKeyFile GKeyFile;
@@ -54,184 +55,230 @@ typedef enum
G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1
} GKeyFileFlags;
+GLIB_AVAILABLE_IN_ALL
GKeyFile *g_key_file_new (void);
+GLIB_AVAILABLE_IN_ALL
GKeyFile *g_key_file_ref (GKeyFile *key_file);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_unref (GKeyFile *key_file);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_free (GKeyFile *key_file);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_list_separator (GKeyFile *key_file,
gchar separator);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_load_from_file (GKeyFile *key_file,
const gchar *file,
GKeyFileFlags flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_load_from_data (GKeyFile *key_file,
const gchar *data,
gsize length,
GKeyFileFlags flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_load_from_dirs (GKeyFile *key_file,
const gchar *file,
const gchar **search_dirs,
gchar **full_path,
GKeyFileFlags flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file,
const gchar *file,
gchar **full_path,
GKeyFileFlags flags,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar *g_key_file_to_data (GKeyFile *key_file,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_key_file_get_start_group (GKeyFile *key_file) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar **g_key_file_get_groups (GKeyFile *key_file,
gsize *length) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar **g_key_file_get_keys (GKeyFile *key_file,
const gchar *group_name,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_has_group (GKeyFile *key_file,
const gchar *group_name);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_has_key (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar *g_key_file_get_value (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_value (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
const gchar *value);
+GLIB_AVAILABLE_IN_ALL
gchar *g_key_file_get_string (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_string (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
const gchar *string);
+GLIB_AVAILABLE_IN_ALL
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;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_locale_string (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
const gchar *locale,
const gchar *string);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_get_boolean (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_boolean (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gboolean value);
+GLIB_AVAILABLE_IN_ALL
gint g_key_file_get_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gint value);
+GLIB_AVAILABLE_IN_ALL
gint64 g_key_file_get_int64 (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_int64 (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gint64 value);
+GLIB_AVAILABLE_IN_ALL
guint64 g_key_file_get_uint64 (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_uint64 (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
guint64 value);
+GLIB_AVAILABLE_IN_ALL
gdouble g_key_file_get_double (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_double (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gdouble value);
+GLIB_AVAILABLE_IN_ALL
gchar **g_key_file_get_string_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_string_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
const gchar * const list[],
gsize length);
+GLIB_AVAILABLE_IN_ALL
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;
+GLIB_AVAILABLE_IN_ALL
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);
+GLIB_AVAILABLE_IN_ALL
gboolean *g_key_file_get_boolean_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_boolean_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gboolean list[],
gsize length);
+GLIB_AVAILABLE_IN_ALL
gint *g_key_file_get_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_double_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gdouble list[],
gsize length);
+GLIB_AVAILABLE_IN_ALL
gdouble *g_key_file_get_double_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gsize *length,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_key_file_set_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gint list[],
gsize length);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_set_comment (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
const gchar *comment,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gchar *g_key_file_get_comment (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_remove_comment (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_remove_key (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_key_file_remove_group (GKeyFile *key_file,
const gchar *group_name,
GError **error);
@@ -258,6 +305,8 @@ gboolean g_key_file_remove_group (GKeyFile *key_file,
#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_KEY_DBUS_ACTIVATABLE "DBusActivatable"
+#define G_KEY_FILE_DESKTOP_KEY_ACTIONS "Actions"
#define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application"
#define G_KEY_FILE_DESKTOP_TYPE_LINK "Link"
diff --git a/glib/glib/glib-init.c b/glib/glib/glib-init.c
index 3ec89a0..8f45306 100644
--- a/glib/glib/glib-init.c
+++ b/glib/glib/glib-init.c
@@ -223,6 +223,10 @@ glib_init (void)
#if defined (G_OS_WIN32)
+BOOL WINAPI DllMain (HINSTANCE hinstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved);
+
HMODULE glib_dll;
#endif
@@ -239,12 +243,16 @@ DllMain (HINSTANCE hinstDLL,
case DLL_PROCESS_ATTACH:
glib_dll = hinstDLL;
g_clock_win32_init ();
+#ifdef THREADS_WIN32
g_thread_win32_init ();
+#endif
glib_init ();
break;
case DLL_THREAD_DETACH:
+#ifdef THREADS_WIN32
g_thread_win32_thread_detach ();
+#endif
break;
default:
diff --git a/glib/glib/glib-init.h b/glib/glib/glib-init.h
index bf1ecd0..016465f 100644
--- a/glib/glib/glib-init.h
+++ b/glib/glib/glib-init.h
@@ -24,17 +24,17 @@
#include "gmessages.h"
-G_GNUC_INTERNAL extern GLogLevelFlags g_log_always_fatal;
-G_GNUC_INTERNAL extern GLogLevelFlags g_log_msg_prefix;
+extern GLogLevelFlags g_log_always_fatal;
+extern GLogLevelFlags g_log_msg_prefix;
GLIB_VAR gboolean g_mem_gc_friendly;
#ifdef G_OS_WIN32
#include <windows.h>
-G_GNUC_INTERNAL void g_thread_win32_thread_detach (void);
-G_GNUC_INTERNAL void g_thread_win32_init (void);
-G_GNUC_INTERNAL void g_clock_win32_init (void);
-G_GNUC_INTERNAL extern HMODULE glib_dll;
+void g_thread_win32_thread_detach (void);
+void g_thread_win32_init (void);
+void g_clock_win32_init (void);
+extern HMODULE glib_dll;
#endif
#endif /* __GLIB_INIT_H__ */
diff --git a/glib/glib/glib-mirroring-tab/gen-mirroring-tab.c b/glib/glib/glib-mirroring-tab/gen-mirroring-tab.c
index 6b16376..253d143 100644
--- a/glib/glib/glib-mirroring-tab/gen-mirroring-tab.c
+++ b/glib/glib/glib-mirroring-tab/gen-mirroring-tab.c
@@ -157,9 +157,9 @@ read_data (
{
FILE *f;
- fprintf (stderr, "Reading `%s'\n", data_file_name);
+ 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);
+ die2 ("error: cannot open '%s' for reading", data_file_name);
if (!strcmp (data_file_type, "BidiMirroring.txt"))
read_bidi_mirroring_txt (f);
@@ -179,7 +179,7 @@ gen_mirroring_tab (
const char *key_type;
fprintf (stderr,
- "Generating `" outputname "', it may take up to a few minutes\n");
+ "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);
diff --git a/glib/glib/glib-private.c b/glib/glib/glib-private.c
index 3946e77..c357502 100644
--- a/glib/glib/glib-private.c
+++ b/glib/glib/glib-private.c
@@ -19,6 +19,8 @@
* Author: Colin Walters <walters@verbum.org>
*/
+#include "config.h"
+
#include "glib-private.h"
/**
@@ -38,7 +40,13 @@ glib__private__ (void)
g_wakeup_signal,
g_wakeup_acknowledge,
- g_get_worker_context
+ g_get_worker_context,
+
+ g_check_setuid,
+ g_main_context_new_with_next_id,
+
+ g_dir_open_with_errno,
+ g_dir_new_from_dirp
};
return &table;
diff --git a/glib/glib/glib-private.h b/glib/glib/glib-private.h
index fde0be8..44cbf3d 100644
--- a/glib/glib/glib-private.h
+++ b/glib/glib/glib-private.h
@@ -23,8 +23,18 @@
#include <glib.h>
#include "gwakeup.h"
-G_GNUC_INTERNAL
GMainContext * g_get_worker_context (void);
+gboolean g_check_setuid (void);
+GMainContext * g_main_context_new_with_next_id (guint next_id);
+
+#ifdef G_OS_WIN32
+gchar *_glib_get_dll_directory (void);
+GLIB_AVAILABLE_IN_ALL
+gchar *_glib_get_locale_dir (void);
+#endif
+
+GDir * g_dir_open_with_errno (const gchar *path, guint flags);
+GDir * g_dir_new_from_dirp (gpointer dirp);
#define GLIB_PRIVATE_CALL(symbol) (glib__private__()->symbol)
@@ -39,9 +49,18 @@ typedef struct {
/* See gmain.c */
GMainContext * (* g_get_worker_context) (void);
+
+ gboolean (* g_check_setuid) (void);
+ GMainContext * (* g_main_context_new_with_next_id) (guint next_id);
+
+ GDir * (* g_dir_open_with_errno) (const gchar *path,
+ guint flags);
+ GDir * (* g_dir_new_from_dirp) (gpointer dirp);
+
/* Add other private functions here, initialize them in glib-private.c */
} GLibPrivateVTable;
+GLIB_AVAILABLE_IN_ALL
GLibPrivateVTable *glib__private__ (void);
#endif /* __G_MAIN_H__ */
diff --git a/glib/glib/glib-unix.c b/glib/glib/glib-unix.c
index b26609a..8f1fe1c 100644
--- a/glib/glib/glib-unix.c
+++ b/glib/glib/glib-unix.c
@@ -23,6 +23,11 @@
#include "config.h"
+/* To make bionic export pipe2() */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
#include "glib-unix.h"
#include "gmain-internal.h"
@@ -43,11 +48,7 @@
* "glib-unix.h" header.
*/
-GQuark
-g_unix_error_quark (void)
-{
- return g_quark_from_static_string ("g-unix-error-quark");
-}
+G_DEFINE_QUARK (g-unix-error-quark, g_unix_error)
static gboolean
g_unix_set_error_from_errno (GError **error,
@@ -109,7 +110,11 @@ g_unix_open_pipe (int *fds,
ecode = pipe (fds);
if (ecode == -1)
return g_unix_set_error_from_errno (error, errno);
- ecode = fcntl (fds[0], flags);
+
+ if (flags == 0)
+ return TRUE;
+
+ ecode = fcntl (fds[0], F_SETFD, flags);
if (ecode == -1)
{
int saved_errno = errno;
@@ -117,7 +122,7 @@ g_unix_open_pipe (int *fds,
close (fds[1]);
return g_unix_set_error_from_errno (error, saved_errno);
}
- ecode = fcntl (fds[1], flags);
+ ecode = fcntl (fds[1], F_SETFD, flags);
if (ecode == -1)
{
int saved_errno = errno;
@@ -179,17 +184,20 @@ g_unix_set_fd_nonblocking (gint fd,
#endif
}
-
/**
* g_unix_signal_source_new:
* @signum: A signal number
*
* Create a #GSource that will be dispatched upon delivery of the UNIX
- * signal @signum. Currently only <literal>SIGHUP</literal>,
- * <literal>SIGINT</literal>, and <literal>SIGTERM</literal> can
- * be monitored. Note that unlike the UNIX default, all sources which
- * have created a watch will be dispatched, regardless of which
- * underlying thread invoked g_unix_signal_source_new().
+ * signal @signum. In GLib versions before 2.36, only
+ * <literal>SIGHUP</literal>, <literal>SIGINT</literal>,
+ * <literal>SIGTERM</literal> can be monitored. In GLib 2.36,
+ * <literal>SIGUSR1</literal> and <literal>SIGUSR2</literal> were
+ * added.
+ *
+ * Note that unlike the UNIX default, all sources which have created a
+ * watch will be dispatched, regardless of which underlying thread
+ * invoked g_unix_signal_source_new().
*
* For example, an effective use of this function is to handle <literal>SIGTERM</literal>
* cleanly; flushing any outstanding files, and then calling
@@ -213,7 +221,8 @@ g_unix_set_fd_nonblocking (gint fd,
GSource *
g_unix_signal_source_new (int signum)
{
- g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM, NULL);
+ g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM ||
+ signum == SIGUSR1 || signum == SIGUSR2, NULL);
return _g_main_create_unix_signal_watch (signum);
}
@@ -233,6 +242,7 @@ g_unix_signal_source_new (int signum)
*
* Returns: An ID (greater than 0) for the event source
*
+ * Rename to: g_unix_signal_add
* Since: 2.30
*/
guint
@@ -278,3 +288,142 @@ g_unix_signal_add (int signum,
{
return g_unix_signal_add_full (G_PRIORITY_DEFAULT, signum, handler, user_data, NULL);
}
+
+typedef struct
+{
+ GSource source;
+
+ gint fd;
+ gpointer tag;
+} GUnixFDSource;
+
+static gboolean
+g_unix_fd_source_dispatch (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+{
+ GUnixFDSource *fd_source = (GUnixFDSource *) source;
+ GUnixFDSourceFunc func = (GUnixFDSourceFunc) callback;
+
+ if (!callback)
+ {
+ g_warning ("GUnixFDSource dispatched without callback\n"
+ "You must call g_source_set_callback().");
+ return FALSE;
+ }
+
+ return (* func) (fd_source->fd, g_source_query_unix_fd (source, fd_source->tag), user_data);
+}
+
+GSourceFuncs g_unix_fd_source_funcs = {
+ NULL, NULL, g_unix_fd_source_dispatch, NULL
+};
+
+/**
+ * g_unix_fd_source_new:
+ * @fd: a file descriptor
+ * @condition: IO conditions to watch for on @fd
+ *
+ * Creates a #GSource to watch for a particular IO condition on a file
+ * descriptor.
+ *
+ * The source will never close the fd -- you must do it yourself.
+ *
+ * Returns: the newly created #GSource
+ *
+ * Since: 2.36
+ **/
+GSource *
+g_unix_fd_source_new (gint fd,
+ GIOCondition condition)
+{
+ GUnixFDSource *fd_source;
+ GSource *source;
+
+ source = g_source_new (&g_unix_fd_source_funcs, sizeof (GUnixFDSource));
+ fd_source = (GUnixFDSource *) source;
+
+ fd_source->fd = fd;
+ fd_source->tag = g_source_add_unix_fd (source, fd, condition);
+
+ return source;
+}
+
+/**
+ * g_unix_fd_add_full:
+ * @priority: the priority of the source
+ * @fd: a file descriptor
+ * @condition: IO conditions to watch for on @fd
+ * @function: a #GUnixFDSourceFunc
+ * @user_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 IO condition, as specified by
+ * @condition becomes true for @fd.
+ *
+ * This is the same as g_unix_fd_add(), except that it allows you to
+ * specify a non-default priority and a provide a #GDestroyNotify for
+ * @user_data.
+ *
+ * Returns: the ID (greater than 0) of the event source
+ *
+ * Since: 2.36
+ **/
+guint
+g_unix_fd_add_full (gint priority,
+ gint fd,
+ GIOCondition condition,
+ GUnixFDSourceFunc function,
+ gpointer user_data,
+ GDestroyNotify notify)
+{
+ GSource *source;
+ guint id;
+
+ g_return_val_if_fail (function != NULL, 0);
+
+ source = g_unix_fd_source_new (fd, condition);
+
+ if (priority != G_PRIORITY_DEFAULT)
+ g_source_set_priority (source, priority);
+
+ g_source_set_callback (source, (GSourceFunc) function, user_data, notify);
+ id = g_source_attach (source, NULL);
+ g_source_unref (source);
+
+ return id;
+}
+
+/**
+ * g_unix_fd_add:
+ * @fd: a file descriptor
+ * @condition: IO conditions to watch for on @fd
+ * @function: a #GPollFDFunc
+ * @user_data: data to pass to @function
+ *
+ * Sets a function to be called when the IO condition, as specified by
+ * @condition becomes true for @fd.
+ *
+ * @function will be called when the specified IO condition becomes
+ * %TRUE. The function is expected to clear whatever event caused the
+ * IO condition to become true and return %TRUE in order to be notified
+ * when it happens again. If @function returns %FALSE then the watch
+ * will be cancelled.
+ *
+ * The return value of this function can be passed to g_source_remove()
+ * to cancel the watch at any time that it exists.
+ *
+ * The source will never close the fd -- you must do it yourself.
+ *
+ * Returns: the ID (greater than 0) of the event source
+ *
+ * Since: 2.36
+ **/
+guint
+g_unix_fd_add (gint fd,
+ GIOCondition condition,
+ GUnixFDSourceFunc function,
+ gpointer user_data)
+{
+ return g_unix_fd_add_full (G_PRIORITY_DEFAULT, fd, condition, function, user_data, NULL);
+}
diff --git a/glib/glib/glib-unix.h b/glib/glib/glib-unix.h
index c04f66f..66ccf74 100644
--- a/glib/glib/glib-unix.h
+++ b/glib/glib/glib-unix.h
@@ -85,6 +85,39 @@ guint g_unix_signal_add (gint signum,
GSourceFunc handler,
gpointer user_data);
+/**
+ * GUnixFDSourceFunc:
+ * @fd: the fd that triggered the event
+ * @condition: the IO conditions reported on @fd
+ * @user_data: user data passed to g_unix_fd_add()
+ *
+ * The type of functions to be called when a UNIX fd watch source
+ * triggers.
+ *
+ * Returns: %FALSE if the source should be removed
+ **/
+typedef gboolean (*GUnixFDSourceFunc) (gint fd,
+ GIOCondition condition,
+ gpointer user_data);
+
+GLIB_AVAILABLE_IN_2_36
+GSource *g_unix_fd_source_new (gint fd,
+ GIOCondition condition);
+
+GLIB_AVAILABLE_IN_2_36
+guint g_unix_fd_add_full (gint priority,
+ gint fd,
+ GIOCondition condition,
+ GUnixFDSourceFunc function,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+GLIB_AVAILABLE_IN_2_36
+guint g_unix_fd_add (gint fd,
+ GIOCondition condition,
+ GUnixFDSourceFunc function,
+ gpointer user_data);
+
G_END_DECLS
#endif /* __G_UNIX_H__ */
diff --git a/glib/glib/glib.h b/glib/glib/glib.h
index 1ba1f47..6f53fcd 100644
--- a/glib/glib/glib.h
+++ b/glib/glib/glib.h
@@ -99,12 +99,14 @@
#include <glib/gwin32.h>
#endif
+#ifndef G_DISABLE_DEPRECATED
#include <glib/deprecated/gallocator.h>
#include <glib/deprecated/gcache.h>
#include <glib/deprecated/gcompletion.h>
#include <glib/deprecated/gmain.h>
#include <glib/deprecated/grel.h>
#include <glib/deprecated/gthread.h>
+#endif /* G_DISABLE_DEPRECATED */
#undef __GLIB_H_INSIDE__
diff --git a/glib/glib/glib.py b/glib/glib/glib.py
index 9a47d52..64459b3 100644
--- a/glib/glib/glib.py
+++ b/glib/glib/glib.py
@@ -10,8 +10,15 @@ def g_quark_to_string (quark):
quark = long(quark)
if quark == 0:
return None
- val = read_global_var ("g_quarks")
- max_q = long(read_global_var ("g_quark_seq_id"))
+ try:
+ val = read_global_var ("quarks")
+ max_q = long(read_global_var ("quark_seq_id"))
+ except:
+ try:
+ val = read_global_var ("g_quarks")
+ max_q = long(read_global_var ("g_quark_seq_id"))
+ except:
+ return None;
if quark < max_q:
return val[quark].string()
return None
@@ -130,10 +137,6 @@ class GHashPrinter:
return "map"
def pretty_printer_lookup (val):
- if is_g_type_instance (val):
- return GTypePrettyPrinter (val)
-
-def pretty_printer_lookup (val):
# None yet, want things like hash table and list
type = val.type.unqualified()
diff --git a/glib/glib/glib.symbols b/glib/glib/glib.symbols
deleted file mode 100644
index 6c2db0d..0000000
--- a/glib/glib/glib.symbols
+++ /dev/null
@@ -1,1665 +0,0 @@
-/* This file lists all exported symbols. It is used to generate
- * the glib.def file used to control exports on Windows.
- */
-g_array_append_vals
-g_array_free
-g_array_insert_vals
-g_array_new
-g_array_ref
-g_array_unref
-g_array_get_element_size
-g_array_prepend_vals
-g_array_remove_index
-g_array_remove_index_fast
-g_array_remove_range
-g_array_set_clear_func
-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_free_to_bytes
-g_byte_array_unref
-g_byte_array_ref
-g_byte_array_new
-g_byte_array_new_take
-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_bytes_compare
-g_bytes_equal
-g_bytes_get_data
-g_bytes_get_size
-g_bytes_hash
-g_bytes_new
-g_bytes_new_from_bytes
-g_bytes_new_static
-g_bytes_new_take
-g_bytes_new_with_free_func
-g_bytes_ref
-g_bytes_unref
-g_bytes_unref_to_array
-g_bytes_unref_to_data
-g_ptr_array_add
-g_ptr_array_foreach
-g_ptr_array_free
-g_ptr_array_unref
-g_ptr_array_ref
-g_ptr_array_new
-g_ptr_array_new_full
-g_ptr_array_new_with_free_func
-g_ptr_array_set_free_func
-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
-g_async_queue_length
-g_async_queue_length_unlocked
-g_async_queue_lock
-g_async_queue_new
-g_async_queue_new_full
-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_timeout_pop
-g_async_queue_timeout_pop_unlocked
-g_async_queue_try_pop
-g_async_queue_try_pop_unlocked
-g_async_queue_unlock
-g_async_queue_unref
-g_async_queue_ref_unlocked
-g_async_queue_unref_and_unlock
-g_atomic_int_add
-g_atomic_int_and
-g_atomic_int_compare_and_exchange
-g_atomic_int_dec_and_test
-g_atomic_int_exchange_and_add
-g_atomic_int_get
-g_atomic_int_inc
-g_atomic_int_or
-g_atomic_int_set
-g_atomic_int_xor
-g_atomic_pointer_add
-g_atomic_pointer_and
-g_atomic_pointer_compare_and_exchange
-g_atomic_pointer_get
-g_atomic_pointer_or
-g_atomic_pointer_set
-g_atomic_pointer_xor
-g_on_error_query
-g_on_error_stack_trace
-g_base64_encode_step
-g_base64_encode_close
-g_base64_encode
-g_base64_decode_step
-g_base64_decode
-g_base64_decode_inplace
-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_bookmark_file_set_description
-g_bookmark_file_get_description
-g_bookmark_file_set_mime_type
-g_bookmark_file_get_mime_type
-g_bookmark_file_set_groups
-g_bookmark_file_add_group
-g_bookmark_file_has_group
-g_bookmark_file_get_groups
-g_bookmark_file_add_application
-g_bookmark_file_has_application
-g_bookmark_file_get_applications
-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_bookmark_file_remove_group
-g_bookmark_file_remove_application
-g_bookmark_file_remove_item
-g_bookmark_file_move_item
-g_cache_destroy
-g_cache_insert
-g_cache_key_foreach
-g_cache_new
-g_cache_remove
-g_cache_value_foreach
-g_checksum_type_get_length
-g_checksum_new
-g_checksum_copy
-g_checksum_free
-g_checksum_update
-g_checksum_reset
-g_checksum_get_string
-g_checksum_get_digest
-g_compute_checksum_for_data
-g_compute_checksum_for_string
-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
-g_get_filename_charsets
-g_convert
-g_convert_error_quark
-g_convert_with_fallback
-g_convert_with_iconv
-g_iconv
-g_iconv_close
-g_iconv_open
-g_locale_from_utf8
-g_locale_to_utf8
-g_filename_display_name
-g_filename_display_basename
-#ifndef _WIN64
-g_filename_from_uri PRIVATE
-g_filename_from_utf8 PRIVATE
-g_filename_to_uri PRIVATE
-g_filename_to_utf8 PRIVATE
-#endif
-#ifdef G_OS_WIN32
-g_filename_from_uri_utf8
-g_filename_from_utf8_utf8
-g_filename_to_uri_utf8
-g_filename_to_utf8_utf8
-#endif
-g_uri_list_extract_uris
-g_datalist_clear
-g_datalist_foreach
-g_datalist_get_data
-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
-g_quark_from_static_string
-g_quark_from_string
-g_quark_to_string
-g_quark_try_string
-g_intern_string
-g_intern_static_string
-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_date_get_month
-g_date_get_sunday_week_of_year
-g_date_get_sunday_weeks_in_year
-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_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
-g_date_set_time
-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_date_valid_dmy
-g_date_valid_julian
-g_date_valid_month
-g_date_valid_weekday
-g_date_valid_year
-g_date_time_add
-g_date_time_add_days
-g_date_time_add_full
-g_date_time_add_hours
-g_date_time_add_minutes
-g_date_time_add_months
-g_date_time_add_seconds
-g_date_time_add_weeks
-g_date_time_add_years
-g_date_time_compare
-g_date_time_difference
-g_date_time_equal
-g_date_time_format
-g_date_time_get_day_of_month
-g_date_time_get_day_of_week
-g_date_time_get_day_of_year
-g_date_time_get_hour
-g_date_time_get_microsecond
-g_date_time_get_minute
-g_date_time_get_month
-g_date_time_get_second
-g_date_time_get_seconds
-g_date_time_get_timezone_abbreviation
-g_date_time_get_utc_offset
-g_date_time_get_week_numbering_year
-g_date_time_get_week_of_year
-g_date_time_get_year
-g_date_time_get_ymd
-g_date_time_hash
-g_date_time_is_daylight_savings
-g_date_time_new
-g_date_time_new_from_timeval_local
-g_date_time_new_from_timeval_utc
-g_date_time_new_from_unix_local
-g_date_time_new_from_unix_utc
-g_date_time_new_local
-g_date_time_new_now
-g_date_time_new_now_local
-g_date_time_new_now_utc
-g_date_time_new_utc
-g_date_time_ref
-g_date_time_to_local
-g_date_time_to_timeval
-g_date_time_to_timezone
-g_date_time_to_unix
-g_date_time_to_utc
-g_date_time_unref
-g_time_zone_new
-g_time_zone_new_local
-g_time_zone_new_utc
-g_time_zone_ref
-g_time_zone_unref
-g_time_zone_adjust_time
-g_time_zone_find_interval
-g_time_zone_get_abbreviation
-g_time_zone_get_offset
-g_time_zone_is_dst
-g_dir_close
-#ifndef _WIN64
-g_dir_open PRIVATE
-g_dir_read_name PRIVATE
-#endif
-#ifdef G_OS_WIN32
-g_dir_open_utf8
-g_dir_read_name_utf8
-#endif
-g_dir_rewind
-g_clear_error
-g_error_copy
-g_error_free
-g_error_matches
-g_error_new
-g_error_new_literal
-g_error_new_valist
-g_propagate_error
-g_set_error
-g_set_error_literal
-g_prefix_error
-g_propagate_prefixed_error
-g_build_filename
-g_build_filenamev
-g_build_path
-g_build_pathv
-g_file_error_from_errno
-g_file_error_quark
-#ifndef _WIN64
-g_file_get_contents PRIVATE
-#endif
-g_file_set_contents
-g_dir_make_tmp
-#ifndef _WIN64
-g_file_open_tmp PRIVATE
-g_file_test PRIVATE
-#endif
-g_file_read_link
-g_format_size
-g_format_size_full
-g_format_size_for_display
-#ifndef _WIN64
-g_mkstemp PRIVATE
-#endif
-g_mkdtemp
-g_mkdtemp_full
-g_mkstemp_full
-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
-g_hash_table_add
-g_hash_table_contains
-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
-g_hash_table_iter_init
-g_hash_table_iter_next
-g_hash_table_iter_get_hash_table
-g_hash_table_iter_remove
-g_hash_table_iter_replace
-g_hash_table_iter_steal
-g_hmac_new
-g_hmac_copy
-g_hmac_ref
-g_hmac_unref
-g_hmac_update
-g_hmac_get_string
-g_hmac_get_digest
-g_compute_hmac_for_data
-g_compute_hmac_for_string
-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
-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
-g_io_channel_close
-g_io_channel_read
-g_io_channel_seek
-g_io_channel_write
-g_io_channel_write_chars
-g_io_channel_write_unichar
-#ifdef G_OS_UNIX
-g_io_channel_unix_get_fd
-g_io_channel_unix_new
-g_io_channel_new_file
-#endif
-#ifdef G_OS_WIN32
-g_io_channel_unix_get_fd
-g_io_channel_unix_new
-#ifndef _WIN64
-g_io_channel_new_file PRIVATE
-#endif
-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
-#ifndef _WIN64
-g_io_channel_win32_new_stream_socket PRIVATE
-#endif
-g_io_channel_win32_poll
-g_io_channel_win32_set_debug
-#endif
-g_key_file_error_quark
-g_key_file_ref
-g_key_file_unref
-g_key_file_free
-g_key_file_get_boolean
-g_key_file_get_boolean_list
-g_key_file_get_comment
-g_key_file_get_groups
-g_key_file_get_double
-g_key_file_get_double_list
-g_key_file_get_integer
-g_key_file_get_int64
-g_key_file_get_uint64
-g_key_file_get_integer_list
-g_key_file_get_keys
-g_key_file_get_locale_string
-g_key_file_get_locale_string_list
-g_key_file_get_start_group
-g_key_file_get_string
-g_key_file_get_string_list
-g_key_file_get_value
-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_int64
-g_key_file_set_uint64
-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_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_full
-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
-g_list_pop_allocator
-g_list_position
-g_list_prepend
-g_list_push_allocator
-g_list_remove
-g_list_remove_all
-g_list_remove_link
-g_list_reverse
-g_list_sort
-g_list_sort_with_data
-g_child_watch_add
-g_child_watch_add_full
-g_child_watch_source_new
-g_get_current_time
-g_get_monotonic_time
-g_get_real_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_get_thread_default
-g_main_context_is_owner
-g_main_context_iteration
-g_main_context_new
-g_main_context_pending
-g_main_context_pop_thread_default
-g_main_context_prepare
-g_main_context_push_thread_default
-g_main_context_query
-g_main_context_ref
-g_main_context_ref_thread_default
-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_context_invoke
-g_main_context_invoke_full
-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_child_source
-g_source_add_poll
-g_source_attach
-g_source_destroy
-g_source_get_can_recurse
-g_source_get_context
-g_source_get_time
-g_source_get_current_time
-g_source_get_id
-g_source_get_name
-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_child_source
-g_source_remove_poll
-g_source_set_callback
-g_source_set_callback_indirect
-g_source_set_can_recurse
-g_source_set_funcs
-g_source_set_name
-g_source_set_name_by_id
-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_add_seconds_full
-g_timeout_source_new
-g_timeout_source_new_seconds
-g_mapped_file_new
-g_mapped_file_new_from_fd
-g_mapped_file_get_length
-g_mapped_file_get_contents
-g_mapped_file_ref
-g_mapped_file_unref
-g_mapped_file_free
-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_element_stack
-g_markup_parse_context_get_position
-g_markup_parse_context_get_user_data
-g_markup_parse_context_new
-g_markup_parse_context_parse
-g_markup_parse_context_push
-g_markup_parse_context_pop
-g_markup_printf_escaped
-g_markup_vprintf_escaped
-g_markup_collect_attributes
-g_free
-g_malloc
-g_malloc0
-g_malloc_n
-g_malloc0_n
-g_mem_is_system_malloc
-g_mem_profile
-g_mem_set_vtable
-g_realloc
-g_realloc_n
-g_try_malloc
-g_try_malloc0
-g_try_malloc_n
-g_try_malloc0_n
-g_try_realloc
-g_try_realloc_n
-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
-g_slice_alloc
-g_slice_alloc0
-g_slice_copy
-g_slice_free1
-g_slice_free_chain_with_offset
-g_slice_set_config
-g_slice_get_config
-g_slice_get_config_state
-#ifdef G_ENABLE_DEBUG
-g_slice_debug_tree_statistics
-#endif
-g_printf_string_upper_bound
-g_log
-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_warn_message
-g_assert_warning
-g_print
-g_printerr
-g_set_printerr_handler
-g_set_print_handler
-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
-g_node_pop_allocator
-g_node_prepend
-g_node_push_allocator
-g_node_reverse_children
-g_node_traverse
-g_node_unlink
-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
-g_pattern_match
-g_pattern_match_simple
-g_pattern_match_string
-g_pattern_spec_equal
-g_pattern_spec_free
-g_pattern_spec_new
-g_poll
-g_spaced_primes_closest
-g_fprintf
-g_printf
-g_sprintf
-g_vasprintf
-g_vfprintf
-g_vprintf
-g_vsprintf
-g_snprintf
-g_vsnprintf
-g_qsort_with_data
-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_free_full
-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
-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
-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
-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_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_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_lookup
-g_sequence_lookup_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
-g_shell_error_quark
-g_shell_parse_argv
-g_shell_quote
-g_shell_unquote
-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_full
-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
-g_slist_pop_allocator
-g_slist_position
-g_slist_prepend
-g_slist_push_allocator
-g_slist_remove
-g_slist_remove_all
-g_slist_remove_link
-g_slist_reverse
-g_slist_sort
-g_slist_sort_with_data
-#ifndef _WIN64
-g_spawn_async PRIVATE
-g_spawn_async_with_pipes PRIVATE
-#endif
-g_spawn_close_pid
-#ifndef _WIN64
-g_spawn_command_line_async PRIVATE
-g_spawn_command_line_sync PRIVATE
-#endif
-g_spawn_error_quark
-#ifndef _WIN64
-g_spawn_sync PRIVATE
-#endif
-#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
-#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
-g_utime
-#endif
-g_access
-g_chdir
-g_unlink
-g_rmdir
-g_ascii_digit_value
-g_ascii_dtostr
-g_ascii_formatd
-g_ascii_strdown
-g_ascii_strtod
-g_ascii_strtoull
-g_ascii_strtoll
-g_ascii_strup
-g_ascii_tolower
-g_ascii_toupper
-g_ascii_xdigit_value
-g_ascii_strcasecmp
-g_ascii_strncasecmp
-g_memdup
-g_stpcpy
-g_strcanon
-g_strchomp
-g_strchug
-g_strcompress
-g_strconcat
-g_strdelimit
-g_strdup
-g_strdup_printf
-g_strdupv
-g_strdup_vprintf
-g_strerror
-g_strescape
-g_strfreev
-g_str_has_prefix
-g_str_has_suffix
-g_strjoin
-g_strjoinv
-g_strlcat
-g_strlcpy
-g_strndup
-g_strnfill
-g_strreverse
-g_strrstr
-g_strrstr_len
-g_strsignal
-g_strsplit
-g_strsplit_set
-g_strstr_len
-g_strtod
-g_strcasecmp
-g_strncasecmp
-g_strup
-g_strdown
-g_strv_length
-g_strip_context
-g_dgettext
-g_dcgettext
-g_dngettext
-g_dpgettext
-g_dpgettext2
-g_uri_unescape_string
-g_uri_unescape_segment
-g_uri_parse_scheme
-g_uri_escape_string
-g_string_append
-g_string_append_len
-g_string_append_printf
-g_string_append_unichar
-g_string_append_vprintf
-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_overwrite
-g_string_overwrite_len
-g_string_prepend
-g_string_prepend_c
-g_string_prepend_len
-g_string_prepend_unichar
-g_string_printf
-g_string_set_size
-g_string_sized_new
-g_string_truncate
-g_string_append_uri_escaped
-g_string_down
-g_string_up
-g_string_vprintf
-g_string_append_c
-g_bit_lock
-g_bit_trylock
-g_bit_unlock
-g_pointer_bit_lock
-g_pointer_bit_trylock
-g_pointer_bit_unlock
-g_once_impl
-g_once_init_enter_impl
-g_once_init_leave
-g_once_init_enter
-g_threads_got_initialized
-g_thread_gettime
-g_thread_create
-g_thread_create_full
-g_thread_error_quark
-g_thread_exit
-g_thread_functions_for_glib_use
-g_thread_init_glib
-g_thread_join
-g_thread_new
-g_thread_ref
-g_thread_self
-g_thread_set_priority
-g_thread_try_new
-g_thread_use_default_impl
-g_thread_unref
-g_thread_yield
-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
-g_thread_get_initialized
-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
-g_test_log_set_fatal_handler
-g_assertion_message
-g_assertion_message_cmpnum
-g_assertion_message_cmpstr
-g_assertion_message_expr
-g_assertion_message_error
-g_strcmp0
-g_test_add_data_func
-g_test_add_func
-g_test_add_vtable
-g_test_bug
-g_test_bug_base
-g_test_config_vars
-g_test_create_case
-g_test_create_suite
-g_test_fail
-g_test_get_root
-g_test_init
-g_test_log_buffer_free
-g_test_log_buffer_new
-g_test_log_buffer_pop
-g_test_log_buffer_push
-g_test_log_msg_free
-g_test_log_type_name
-g_test_maximized_result
-g_test_message
-g_test_minimized_result
-g_test_queue_destroy
-g_test_queue_free
-g_test_rand_double
-g_test_rand_double_range
-g_test_rand_int
-g_test_rand_int_range
-g_test_run
-g_test_run_suite
-g_test_suite_add
-g_test_suite_add_suite
-g_test_timer_elapsed
-g_test_timer_last
-g_test_timer_start
-g_test_trap_assertions
-g_test_trap_fork
-g_test_trap_has_passed
-g_test_trap_reached_timeout
-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_usleep
-g_tree_destroy
-g_tree_foreach
-g_tree_height
-g_tree_insert
-g_tree_lookup
-g_tree_lookup_extended
-g_tree_new
-g_tree_ref
-g_tree_unref
-g_tree_new_full
-g_tree_new_with_data
-g_tree_nnodes
-g_tree_remove
-g_tree_replace
-g_tree_search
-g_tree_steal
-g_tree_traverse
-g_unichar_break_type
-g_unichar_combining_class
-g_unichar_compose
-g_unichar_decompose
-g_unichar_isalnum
-g_unichar_isalpha
-g_unichar_iscntrl
-g_unichar_isdefined
-g_unichar_isdigit
-g_unichar_isgraph
-g_unichar_islower
-g_unichar_isprint
-g_unichar_ispunct
-g_unichar_isspace
-g_unichar_istitle
-g_unichar_isupper
-g_unichar_iswide
-g_unichar_iswide_cjk
-g_unichar_isxdigit
-g_unichar_iszerowidth
-g_unichar_fully_decompose
-g_unichar_tolower
-g_unichar_totitle
-g_unichar_toupper
-g_unichar_ismark
-g_unichar_get_mirror_char
-g_unichar_get_script
-g_unichar_digit_value
-g_unichar_xdigit_value
-g_unichar_type
-g_unicode_canonical_decomposition
-g_unicode_canonical_ordering
-g_unicode_script_from_iso15924
-g_unicode_script_to_iso15924
-g_utf8_casefold
-g_utf8_collate
-g_utf8_collate_key
-g_utf8_collate_key_for_filename
-g_utf8_find_next_char
-g_utf8_find_prev_char
-g_utf8_get_char
-g_utf8_get_char_validated
-g_utf8_normalize
-g_utf8_offset_to_pointer
-g_utf8_pointer_to_offset
-g_utf8_prev_char
-g_utf8_strup
-g_utf8_strdown
-g_utf8_strchr
-g_utf8_strlen
-g_utf8_strncpy
-g_utf8_strrchr
-g_utf8_strreverse
-g_utf8_substring
-g_utf8_to_ucs4
-g_utf8_to_ucs4_fast
-g_utf8_to_utf16
-g_utf8_validate
-g_get_charset
-g_ucs4_to_utf16
-g_ucs4_to_utf8
-g_utf16_to_ucs4
-g_utf16_to_utf8
-g_unichar_to_utf8
-g_unichar_validate
-glib_pgettext
-glib_gettext
-#ifdef G_OS_WIN32
-_glib_get_locale_dir
-#endif
-g_int_equal
-g_int_hash
-g_int64_equal
-g_int64_hash
-g_double_equal
-g_double_hash
-g_direct_equal
-g_direct_hash
-g_str_equal
-g_str_hash
-g_atexit
-g_basename
-g_get_application_name
-#ifndef _WIN64
-g_find_program_in_path PRIVATE
-g_get_current_dir PRIVATE
-g_getenv PRIVATE
-g_unsetenv PRIVATE
-g_get_home_dir PRIVATE
-g_setenv PRIVATE
-#endif
-g_get_host_name
-g_listenv
-g_get_environ
-g_environ_getenv
-g_environ_setenv
-g_environ_unsetenv
-#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_locale_variants
-g_get_prgname
-#ifndef _WIN64
-g_get_real_name PRIVATE
-#endif
-#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
-#ifndef _WIN64
-g_get_tmp_dir PRIVATE
-#endif
-#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_reload_user_special_dirs_cache
-g_get_user_runtime_dir
-g_get_user_special_dir
-#ifndef _WIN64
-g_get_user_name PRIVATE
-#endif
-#ifdef G_OS_WIN32
-g_get_user_name_utf8
-#endif
-glib_check_version
-glib__private__
-g_nullify_pointer
-g_parse_debug_string
-g_path_get_basename
-g_path_get_dirname
-g_path_is_absolute
-g_path_skip_root
-g_set_application_name
-g_set_prgname
-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
-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_get_compile_flags
-g_regex_get_match_flags
-g_regex_escape_string
-g_regex_escape_nul
-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_ref
-g_match_info_unref
-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
-g_variant_type_string_is_valid
-g_variant_type_string_scan
-g_variant_type_free
-g_variant_type_copy
-g_variant_type_new
-g_variant_type_get_string_length
-g_variant_type_peek_string
-g_variant_type_dup_string
-g_variant_type_is_definite
-g_variant_type_is_container
-g_variant_type_is_basic
-g_variant_type_is_maybe
-g_variant_type_is_array
-g_variant_type_is_tuple
-g_variant_type_is_dict_entry
-g_variant_type_is_variant
-g_variant_type_hash
-g_variant_type_equal
-g_variant_type_is_subtype_of
-g_variant_type_element
-g_variant_type_first
-g_variant_type_next
-g_variant_type_n_items
-g_variant_type_key
-g_variant_type_value
-g_variant_type_new_array
-g_variant_type_new_maybe
-g_variant_type_new_tuple
-g_variant_type_new_dict_entry
-g_variant_type_checked_
-g_variant_unref
-g_variant_ref
-g_variant_ref_sink
-g_variant_is_floating
-g_variant_take_ref
-g_variant_n_children
-g_variant_get_child_value
-g_variant_get_size
-g_variant_get_data
-g_variant_store
-g_variant_is_normal_form
-g_variant_get_type
-g_variant_get_type_string
-g_variant_is_of_type
-g_variant_is_container
-g_variant_classify
-g_variant_compare
-g_variant_new_boolean
-g_variant_new_byte
-g_variant_new_int16
-g_variant_new_uint16
-g_variant_new_int32
-g_variant_new_uint32
-g_variant_new_int64
-g_variant_new_uint64
-g_variant_new_handle
-g_variant_new_double
-g_variant_new_fixed_array
-g_variant_new_string
-g_variant_new_object_path
-g_variant_is_object_path
-g_variant_new_signature
-g_variant_is_signature
-g_variant_new_variant
-g_variant_new_strv
-g_variant_new_objv
-g_variant_new_bytestring
-g_variant_new_bytestring_array
-g_variant_get_boolean
-g_variant_get_byte
-g_variant_get_int16
-g_variant_get_uint16
-g_variant_get_int32
-g_variant_get_uint32
-g_variant_get_int64
-g_variant_get_uint64
-g_variant_get_handle
-g_variant_get_double
-g_variant_get_string
-g_variant_dup_string
-g_variant_get_variant
-g_variant_get_strv
-g_variant_dup_strv
-g_variant_get_objv
-g_variant_dup_objv
-g_variant_get_bytestring
-g_variant_dup_bytestring
-g_variant_get_bytestring_array
-g_variant_dup_bytestring_array
-g_variant_new_maybe
-g_variant_new_array
-g_variant_new_tuple
-g_variant_new_dict_entry
-g_variant_get_maybe
-g_variant_get_fixed_array
-g_variant_print
-g_variant_print_string
-g_variant_hash
-g_variant_equal
-g_variant_iter_copy
-g_variant_iter_free
-g_variant_iter_init
-g_variant_iter_n_children
-g_variant_iter_new
-g_variant_iter_next_value
-g_variant_builder_add_value
-g_variant_builder_init
-g_variant_builder_clear
-g_variant_builder_open
-g_variant_builder_close
-g_variant_builder_end
-g_variant_builder_new
-g_variant_builder_unref
-g_variant_builder_ref
-g_variant_new_va
-g_variant_get_va
-g_variant_new
-g_variant_get
-g_variant_builder_add
-g_variant_get_child
-g_variant_lookup_value
-g_variant_lookup
-g_variant_iter_next
-g_variant_iter_loop
-g_variant_new_from_data
-g_variant_get_normal_form
-g_variant_byteswap
-g_variant_new_parsed
-g_variant_new_parsed_va
-g_variant_builder_add_parsed
-g_variant_parse
-g_variant_parser_get_error_quark
-g_variant_type_info_get_type_string
-g_variant_type_info_query
-g_variant_type_info_element
-g_variant_type_info_query_element
-g_variant_type_info_n_members
-g_variant_type_info_member_info
-g_variant_type_info_get
-g_variant_type_info_ref
-g_variant_type_info_unref
-g_variant_type_info_assert_no_infos
-g_variant_serialised_byteswap
-g_variant_serialised_get_child
-g_variant_serialised_is_normal
-g_variant_serialised_n_children
-g_variant_serialiser_is_object_path
-g_variant_serialiser_is_signature
-g_variant_serialiser_is_string
-g_variant_serialiser_needed_size
-g_variant_serialiser_serialise
-g_variant_format_string_scan_type
-g_variant_format_string_scan
-#ifdef G_OS_WIN32
-g_win32_error_message
-g_win32_ftruncate
-g_win32_get_package_installation_directory_of_module
-#ifndef _WIN64
-g_win32_get_package_installation_directory PRIVATE
-#endif
-g_win32_get_package_installation_directory_utf8
-#ifndef _WIN64
-g_win32_get_package_installation_subdirectory PRIVATE
-#endif
-g_win32_get_package_installation_subdirectory_utf8
-g_win32_get_windows_version
-g_win32_getlocale
-g_win32_locale_filename_from_utf8
-#endif
-g_hostname_is_non_ascii
-g_hostname_is_ascii_encoded
-g_hostname_is_ip_address
-g_hostname_to_ascii
-g_hostname_to_unicode
-#ifdef G_OS_UNIX
-g_unix_error_quark
-g_unix_open_pipe
-g_unix_set_fd_nonblocking
-g_unix_signal_add
-g_unix_signal_add_full
-g_unix_signal_source_new
-#endif
-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
-g_cond_broadcast
-g_cond_clear
-g_cond_free
-g_cond_init
-g_cond_new
-g_cond_signal
-g_cond_timed_wait
-g_cond_wait
-g_cond_wait_until
-g_mutex_clear
-g_mutex_free
-g_mutex_init
-g_mutex_lock
-g_mutex_new
-g_mutex_trylock
-g_mutex_unlock
-g_private_new
-g_private_get
-g_private_replace
-g_private_set
-g_rw_lock_clear
-g_rw_lock_init
-g_rw_lock_reader_lock
-g_rw_lock_reader_trylock
-g_rw_lock_reader_unlock
-g_rw_lock_writer_lock
-g_rw_lock_writer_trylock
-g_rw_lock_writer_unlock
-g_rec_mutex_clear
-g_rec_mutex_init
-g_rec_mutex_lock
-g_rec_mutex_trylock
-g_rec_mutex_unlock
diff --git a/glib/glib/glibintl.h b/glib/glib/glibintl.h
index 507e1c3..4f2e58b 100644
--- a/glib/glib/glibintl.h
+++ b/glib/glib/glibintl.h
@@ -5,7 +5,9 @@
#error "config.h must be included prior to glibintl.h"
#endif
+GLIB_AVAILABLE_IN_ALL
const gchar * glib_gettext (const gchar *str) G_GNUC_FORMAT(1);
+GLIB_AVAILABLE_IN_ALL
const gchar * glib_pgettext (const gchar *msgctxtid,
gsize msgidoffset) G_GNUC_FORMAT(1);
diff --git a/glib/glib/glist.c b/glib/glib/glist.c
index dac7dc8..073bcaa 100644
--- a/glib/glib/glist.c
+++ b/glib/glib/glist.c
@@ -32,6 +32,7 @@
#include "glist.h"
#include "gslice.h"
+#include "gmessages.h"
#include "gtestutils.h"
@@ -97,18 +98,20 @@
/**
* g_list_previous:
* @list: an element in a #GList.
- * @Returns: the previous element, or %NULL if there are no previous
- * elements.
*
* A convenience macro to get the previous element in a #GList.
+ *
+ * Returns: the previous element, or %NULL if there are no previous
+ * elements.
**/
/**
* g_list_next:
* @list: an element in a #GList.
- * @Returns: the next element, or %NULL if there are no more elements.
*
* A convenience macro to get the next element in a #GList.
+ *
+ * Returns: the next element, or %NULL if there are no more elements.
**/
#define _g_list_alloc() g_slice_new (GList)
@@ -117,11 +120,12 @@
/**
* g_list_alloc:
- * @Returns: a pointer to the newly-allocated #GList element.
*
* 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.
+ *
+ * Returns: a pointer to the newly-allocated #GList element.
**/
GList*
g_list_alloc (void)
@@ -417,6 +421,37 @@ g_list_concat (GList *list1, GList *list2)
return list1;
}
+static inline GList*
+_g_list_remove_link (GList *list,
+ GList *link)
+{
+ if (link == NULL)
+ return list;
+
+ if (link->prev)
+ {
+ if (link->prev->next == link)
+ link->prev->next = link->next;
+ else
+ g_warning ("corrupted double-linked list detected");
+ }
+ if (link->next)
+ {
+ if (link->next->prev == link)
+ link->next->prev = link->prev;
+ else
+ g_warning ("corrupted double-linked list detected");
+ }
+
+ if (link == list)
+ list = list->next;
+
+ link->next = NULL;
+ link->prev = NULL;
+
+ return list;
+}
+
/**
* g_list_remove:
* @list: a #GList
@@ -433,7 +468,7 @@ g_list_remove (GList *list,
gconstpointer data)
{
GList *tmp;
-
+
tmp = list;
while (tmp)
{
@@ -441,16 +476,9 @@ g_list_remove (GList *list,
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;
-
+ list = _g_list_remove_link (list, tmp);
_g_list_free1 (tmp);
-
+
break;
}
}
@@ -462,9 +490,9 @@ g_list_remove (GList *list,
* @list: a #GList
* @data: data to remove
*
- * 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
+ * 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.
*
* Returns: new head of @list
@@ -497,27 +525,6 @@ g_list_remove_all (GList *list,
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;
-}
-
/**
* g_list_remove_link:
* @list: a #GList
@@ -566,7 +573,8 @@ g_list_delete_link (GList *list,
* <note><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 is not.
+ * the actual data is not. See g_list_copy_deep() if you need
+ * to copy the data as well.
* </para></note>
*
* Returns: a copy of @list
@@ -574,6 +582,41 @@ g_list_delete_link (GList *list,
GList*
g_list_copy (GList *list)
{
+ return g_list_copy_deep (list, NULL, NULL);
+}
+
+/**
+ * g_list_copy_deep:
+ * @list: a #GList
+ * @func: a copy function used to copy every element in the list
+ * @user_data: user data passed to the copy function @func, or #NULL
+ *
+ * Makes a full (deep) copy of a #GList.
+ *
+ * In contrast with g_list_copy(), this function uses @func to make a copy of
+ * each list element, in addition to copying the list container itself.
+ *
+ * @func, as a #GCopyFunc, takes two arguments, the data to be copied and a user
+ * pointer. It's safe to pass #NULL as user_data, if the copy function takes only
+ * one argument.
+ *
+ * For instance, if @list holds a list of GObjects, you can do:
+ * |[
+ * another_list = g_list_copy_deep (list, (GCopyFunc) g_object_ref, NULL);
+ * ]|
+ *
+ * And, to entirely free the new list, you could do:
+ * |[
+ * g_list_free_full (another_list, g_object_unref);
+ * ]|
+ *
+ * Returns: a full copy of @list, use #g_list_free_full to free it
+ *
+ * Since: 2.34
+ */
+GList*
+g_list_copy_deep (GList *list, GCopyFunc func, gpointer user_data)
+{
GList *new_list = NULL;
if (list)
@@ -581,7 +624,10 @@ g_list_copy (GList *list)
GList *last;
new_list = _g_list_alloc ();
- new_list->data = list->data;
+ if (func)
+ new_list->data = func (list->data, user_data);
+ else
+ new_list->data = list->data;
new_list->prev = NULL;
last = new_list;
list = list->next;
@@ -590,7 +636,10 @@ g_list_copy (GList *list)
last->next = _g_list_alloc ();
last->next->prev = last;
last = last->next;
- last->data = list->data;
+ if (func)
+ last->data = func (list->data, user_data);
+ else
+ last->data = list->data;
list = list->next;
}
last->next = NULL;
@@ -1084,13 +1133,14 @@ g_list_sort_real (GList *list,
* GCompareFunc:
* @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.
*
* 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.
+ *
+ * Returns: negative value if @a &lt; @b; zero if @a = @b; positive
+ * value if @a > @b.
**/
GList *
g_list_sort (GList *list,
@@ -1116,13 +1166,14 @@ g_list_sort (GList *list,
* @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.
*
* 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.
+ *
+ * Returns: negative value if @a &lt; @b; zero if @a = @b; positive
+ * value if @a > @b.
**/
GList *
g_list_sort_with_data (GList *list,
diff --git a/glib/glib/glist.h b/glib/glib/glist.h
index aaa11f2..120e788 100644
--- a/glib/glib/glist.h
+++ b/glib/glib/glist.h
@@ -24,14 +24,15 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_LIST_H__
+#define __G_LIST_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_LIST_H__
-#define __G_LIST_H__
-
#include <glib/gmem.h>
+#include <glib/gnode.h>
G_BEGIN_DECLS
@@ -46,65 +47,101 @@ struct _GList
/* Doubly linked lists
*/
+GLIB_AVAILABLE_IN_ALL
GList* g_list_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
void g_list_free (GList *list);
+GLIB_AVAILABLE_IN_ALL
void g_list_free_1 (GList *list);
#define g_list_free1 g_list_free_1
+GLIB_AVAILABLE_IN_ALL
void g_list_free_full (GList *list,
GDestroyNotify free_func);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_append (GList *list,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_prepend (GList *list,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_insert (GList *list,
gpointer data,
gint position) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_insert_sorted (GList *list,
gpointer data,
GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_insert_sorted_with_data (GList *list,
gpointer data,
GCompareDataFunc func,
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_insert_before (GList *list,
GList *sibling,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_concat (GList *list1,
GList *list2) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_remove (GList *list,
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_remove_all (GList *list,
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_remove_link (GList *list,
GList *llink) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_delete_link (GList *list,
GList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_reverse (GList *list) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_copy (GList *list) G_GNUC_WARN_UNUSED_RESULT;
+
+GLIB_AVAILABLE_IN_2_34
+GList* g_list_copy_deep (GList *list,
+ GCopyFunc func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+
+GLIB_AVAILABLE_IN_ALL
GList* g_list_nth (GList *list,
guint n);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_nth_prev (GList *list,
guint n);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_find (GList *list,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_find_custom (GList *list,
gconstpointer data,
GCompareFunc func);
+GLIB_AVAILABLE_IN_ALL
gint g_list_position (GList *list,
GList *llink);
+GLIB_AVAILABLE_IN_ALL
gint g_list_index (GList *list,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_last (GList *list);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_first (GList *list);
+GLIB_AVAILABLE_IN_ALL
guint g_list_length (GList *list);
+GLIB_AVAILABLE_IN_ALL
void g_list_foreach (GList *list,
GFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
GList* g_list_sort (GList *list,
GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GList* g_list_sort_with_data (GList *list,
GCompareDataFunc compare_func,
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gpointer g_list_nth_data (GList *list,
guint n);
diff --git a/glib/glib/gmacros.h b/glib/glib/gmacros.h
index 4ad57da..f3f542b 100644
--- a/glib/glib/gmacros.h
+++ b/glib/glib/gmacros.h
@@ -28,13 +28,13 @@
* not refer to variables from glibconfig.h
*/
+#ifndef __G_MACROS_H__
+#define __G_MACROS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MACROS_H__
-#define __G_MACROS_H__
-
/* We include stddef.h to get the system's definition of NULL
*/
#include <stddef.h>
@@ -120,6 +120,12 @@
_Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
#define G_GNUC_END_IGNORE_DEPRECATIONS \
_Pragma ("GCC diagnostic pop")
+#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
+#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+ __pragma (warning (push)) \
+ __pragma (warning (disable : 4996))
+#define G_GNUC_END_IGNORE_DEPRECATIONS \
+ __pragma (warning (pop))
#else
#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS
#define G_GNUC_END_IGNORE_DEPRECATIONS
@@ -152,6 +158,19 @@
#endif /* !__GNUC__ */
#endif /* !G_DISABLE_DEPRECATED */
+/* Clang feature detection: http://clang.llvm.org/docs/LanguageExtensions.html */
+#ifndef __has_feature
+#define __has_feature(x) 0
+#endif
+
+#if __has_feature(attribute_analyzer_noreturn)
+#define G_ANALYZER_ANALYZING 1
+#define G_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
+#else
+#define G_ANALYZER_ANALYZING 0
+#define G_ANALYZER_NORETURN
+#endif
+
#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string)
#define G_STRINGIFY_ARG(contents) #contents
@@ -159,9 +178,9 @@
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2)
#ifdef __COUNTER__
-#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1]
+#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
#else
-#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __LINE__)[(expr) ? 1 : -1]
+#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __LINE__)[(expr) ? 1 : -1] G_GNUC_UNUSED
#endif
#define G_STATIC_ASSERT_EXPR(expr) ((void) sizeof (char[(expr) ? 1 : -1]))
#endif
@@ -174,11 +193,11 @@
#endif
/* Provide a string identifying the current function, non-concatenatable */
-#if defined (__GNUC__)
+#if defined (__GNUC__) && defined (__cplusplus)
# define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__))
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 19901L
# define G_STRFUNC ((const char*) (__func__))
-#elif defined(_MSC_VER) && (_MSC_VER > 1300)
+#elif defined (__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1300))
# define G_STRFUNC ((const char*) (__FUNCTION__))
#else
# define G_STRFUNC ((const char*) ("???"))
@@ -321,7 +340,11 @@
#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
#define G_UNAVAILABLE(maj,min) __declspec(deprecated("is not available before " #maj "." #min))
#else
-#define G_UNAVAILABLE(maj,min)
+#define G_UNAVAILABLE(maj,min) G_DEPRECATED
+#endif
+
+#ifndef _GLIB_EXTERN
+#define _GLIB_EXTERN extern
#endif
/* These macros are used to mark deprecated functions in GLib headers,
@@ -331,13 +354,13 @@
*/
#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS
-#define GLIB_DEPRECATED
-#define GLIB_DEPRECATED_FOR(f)
-#define GLIB_UNAVAILABLE(maj,min)
+#define GLIB_DEPRECATED _GLIB_EXTERN
+#define GLIB_DEPRECATED_FOR(f) _GLIB_EXTERN
+#define GLIB_UNAVAILABLE(maj,min) _GLIB_EXTERN
#else
-#define GLIB_DEPRECATED G_DEPRECATED
-#define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f)
-#define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min)
+#define GLIB_DEPRECATED G_DEPRECATED _GLIB_EXTERN
+#define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GLIB_EXTERN
+#define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GLIB_EXTERN
#endif
#endif /* __G_MACROS_H__ */
diff --git a/glib/glib/gmain-internal.h b/glib/glib/gmain-internal.h
index 648aff3..97775ca 100644
--- a/glib/glib/gmain-internal.h
+++ b/glib/glib/gmain-internal.h
@@ -17,13 +17,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_MAIN_INTERNAL_H__
+#define __G_MAIN_INTERNAL_H__
+
#if !defined (GLIB_COMPILATION)
#error "This is a private header"
#endif
-#ifndef __G_MAIN_INTERNAL_H__
-#define __G_MAIN_INTERNAL_H__
-
#include "gmain.h"
G_BEGIN_DECLS
diff --git a/glib/glib/gmain.c b/glib/glib/gmain.c
index 60c80c7..ed7a9e8 100644
--- a/glib/glib/gmain.c
+++ b/glib/glib/gmain.c
@@ -98,6 +98,7 @@
#include "gwakeup.h"
#include "gmain-internal.h"
+#include "glib-init.h"
#include "glib-private.h"
/**
@@ -195,6 +196,14 @@ typedef enum
G_SOURCE_BLOCKED = 1 << (G_HOOK_FLAG_USER_SHIFT + 2)
} GSourceFlags;
+typedef struct _GSourceList GSourceList;
+
+struct _GSourceList
+{
+ GSource *head, *tail;
+ gint priority;
+};
+
typedef struct _GMainWaiter GMainWaiter;
struct _GMainWaiter
@@ -232,7 +241,8 @@ struct _GMainContext
gint timeout; /* Timeout for current iteration */
guint next_id;
- GSource *source_list;
+ GHashTable *overflow_used_source_ids; /* set<guint> */
+ GList *source_lists;
gint in_check_or_prepare;
GPollRec *poll_records, *poll_records_tail;
@@ -271,7 +281,6 @@ struct _GMainLoop
struct _GTimeoutSource
{
GSource source;
- gint64 expiration;
guint interval;
gboolean seconds;
};
@@ -307,8 +316,23 @@ struct _GSourcePrivate
{
GSList *child_sources;
GSource *parent_source;
+
+ gint64 ready_time;
+
+ /* This is currently only used on UNIX, but we always declare it (and
+ * let it remain empty on Windows) to avoid #ifdef all over the place.
+ */
+ GSList *fds;
};
+typedef struct _GSourceIter
+{
+ GMainContext *context;
+ gboolean may_modify;
+ GList *current_list;
+ GSource *source;
+} GSourceIter;
+
#define LOCK_CONTEXT(context) g_mutex_lock (&context->mutex)
#define UNLOCK_CONTEXT(context) g_mutex_unlock (&context->mutex)
#define G_THREAD_SELF g_thread_self ()
@@ -336,6 +360,9 @@ static void g_source_destroy_internal (GSource *source,
static void g_source_set_priority_unlocked (GSource *source,
GMainContext *context,
gint priority);
+static void g_child_source_remove_internal (GSource *child_source,
+ GMainContext *context);
+
static void g_main_context_poll (GMainContext *context,
gint timeout,
gint priority,
@@ -347,9 +374,13 @@ static void g_main_context_add_poll_unlocked (GMainContext *context,
static void g_main_context_remove_poll_unlocked (GMainContext *context,
GPollFD *fd);
-static gboolean g_timeout_prepare (GSource *source,
- gint *timeout);
-static gboolean g_timeout_check (GSource *source);
+static void g_source_iter_init (GSourceIter *iter,
+ GMainContext *context,
+ gboolean may_modify);
+static gboolean g_source_iter_next (GSourceIter *iter,
+ GSource **source);
+static void g_source_iter_clear (GSourceIter *iter);
+
static gboolean g_timeout_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data);
@@ -377,6 +408,8 @@ static gboolean g_idle_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data);
+static void block_source (GSource *source);
+
static GMainContext *glib_worker_context;
G_LOCK_DEFINE_STATIC (main_loop);
@@ -395,13 +428,14 @@ static volatile sig_atomic_t any_unix_signal_pending;
static volatile int unix_signal_pending[NSIG];
static volatile int any_unix_signal_pending;
#endif
+static volatile guint unix_signal_refcount[NSIG];
/* Guards all the data below */
G_LOCK_DEFINE_STATIC (unix_signal_lock);
static GSList *unix_signal_watches;
static GSList *unix_child_watches;
-static GSourceFuncs g_unix_signal_funcs =
+GSourceFuncs g_unix_signal_funcs =
{
g_unix_signal_watch_prepare,
g_unix_signal_watch_check,
@@ -414,8 +448,8 @@ static GSList *main_context_list = NULL;
GSourceFuncs g_timeout_funcs =
{
- g_timeout_prepare,
- g_timeout_check,
+ NULL, /* prepare */
+ NULL, /* check */
g_timeout_dispatch,
NULL
};
@@ -472,7 +506,11 @@ poll_rec_list_free (GMainContext *context,
void
g_main_context_unref (GMainContext *context)
{
+ GSourceIter iter;
GSource *source;
+ GList *sl_iter;
+ GSourceList *list;
+
g_return_if_fail (context != NULL);
g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
@@ -483,13 +521,25 @@ g_main_context_unref (GMainContext *context)
main_context_list = g_slist_remove (main_context_list, context);
G_UNLOCK (main_context_list);
- source = context->source_list;
- while (source)
+ /* g_source_iter_next() assumes the context is locked. */
+ LOCK_CONTEXT (context);
+ g_source_iter_init (&iter, context, TRUE);
+ while (g_source_iter_next (&iter, &source))
+ {
+ source->context = NULL;
+ g_source_destroy_internal (source, context, TRUE);
+ }
+ UNLOCK_CONTEXT (context);
+
+ for (sl_iter = context->source_lists; sl_iter; sl_iter = sl_iter->next)
{
- GSource *next = source->next;
- g_source_destroy_internal (source, context, FALSE);
- source = next;
+ list = sl_iter->data;
+ g_slice_free (GSourceList, list);
}
+ g_list_free (context->source_lists);
+
+ if (context->overflow_used_source_ids)
+ g_hash_table_destroy (context->overflow_used_source_ids);
g_mutex_clear (&context->mutex);
@@ -504,6 +554,18 @@ g_main_context_unref (GMainContext *context)
g_free (context);
}
+/* Helper function used by mainloop/overflow test.
+ */
+GMainContext *
+g_main_context_new_with_next_id (guint next_id)
+{
+ GMainContext *ret = g_main_context_new ();
+
+ ret->next_id = next_id;
+
+ return ret;
+}
+
/**
* g_main_context_new:
*
@@ -539,7 +601,7 @@ g_main_context_new (void)
context->next_id = 1;
- context->source_list = NULL;
+ context->source_lists = NULL;
context->poll_func = g_poll;
@@ -791,7 +853,7 @@ g_source_new (GSourceFuncs *source_funcs,
g_return_val_if_fail (struct_size >= sizeof (GSource), NULL);
source = (GSource*) g_malloc0 (struct_size);
-
+ source->priv = g_slice_new0 (GSourcePrivate);
source->source_funcs = source_funcs;
source->ref_count = 1;
@@ -799,96 +861,292 @@ g_source_new (GSourceFuncs *source_funcs,
source->flags = G_HOOK_FLAG_ACTIVE;
+ source->priv->ready_time = -1;
+
/* NULL/0 initialization for all other fields */
return source;
}
+/* Holds context's lock */
+static void
+g_source_iter_init (GSourceIter *iter,
+ GMainContext *context,
+ gboolean may_modify)
+{
+ iter->context = context;
+ iter->current_list = NULL;
+ iter->source = NULL;
+ iter->may_modify = may_modify;
+}
+
+/* Holds context's lock */
+static gboolean
+g_source_iter_next (GSourceIter *iter, GSource **source)
+{
+ GSource *next_source;
+
+ if (iter->source)
+ next_source = iter->source->next;
+ else
+ next_source = NULL;
+
+ if (!next_source)
+ {
+ if (iter->current_list)
+ iter->current_list = iter->current_list->next;
+ else
+ iter->current_list = iter->context->source_lists;
+
+ if (iter->current_list)
+ {
+ GSourceList *source_list = iter->current_list->data;
+
+ next_source = source_list->head;
+ }
+ }
+
+ /* Note: unreffing iter->source could potentially cause its
+ * GSourceList to be removed from source_lists (if iter->source is
+ * the only source in its list, and it is destroyed), so we have to
+ * keep it reffed until after we advance iter->current_list, above.
+ */
+
+ if (iter->source && iter->may_modify)
+ SOURCE_UNREF (iter->source, iter->context);
+ iter->source = next_source;
+ if (iter->source && iter->may_modify)
+ iter->source->ref_count++;
+
+ *source = iter->source;
+ return *source != NULL;
+}
+
+/* Holds context's lock. Only necessary to call if you broke out of
+ * the g_source_iter_next() loop early.
+ */
+static void
+g_source_iter_clear (GSourceIter *iter)
+{
+ if (iter->source && iter->may_modify)
+ {
+ SOURCE_UNREF (iter->source, iter->context);
+ iter->source = NULL;
+ }
+}
+
+/* Holds context's lock
+ */
+static GSourceList *
+find_source_list_for_priority (GMainContext *context,
+ gint priority,
+ gboolean create)
+{
+ GList *iter, *last;
+ GSourceList *source_list;
+
+ last = NULL;
+ for (iter = context->source_lists; iter != NULL; last = iter, iter = iter->next)
+ {
+ source_list = iter->data;
+
+ if (source_list->priority == priority)
+ return source_list;
+
+ if (source_list->priority > priority)
+ {
+ if (!create)
+ return NULL;
+
+ source_list = g_slice_new0 (GSourceList);
+ source_list->priority = priority;
+ context->source_lists = g_list_insert_before (context->source_lists,
+ iter,
+ source_list);
+ return source_list;
+ }
+ }
+
+ if (!create)
+ return NULL;
+
+ source_list = g_slice_new0 (GSourceList);
+ source_list->priority = priority;
+
+ if (!last)
+ context->source_lists = g_list_append (NULL, source_list);
+ else
+ {
+ /* This just appends source_list to the end of
+ * context->source_lists without having to walk the list again.
+ */
+ last = g_list_append (last, source_list);
+ }
+ return source_list;
+}
+
/* Holds context's lock
*/
static void
-g_source_list_add (GSource *source,
- GMainContext *context)
+source_add_to_context (GSource *source,
+ GMainContext *context)
{
- GSource *tmp_source, *last_source;
-
- if (source->priv && source->priv->parent_source)
+ GSourceList *source_list;
+ GSource *prev, *next;
+
+ source_list = find_source_list_for_priority (context, source->priority, TRUE);
+
+ if (source->priv->parent_source)
{
+ g_assert (source_list->head != NULL);
+
/* Put the source immediately before its parent */
- tmp_source = source->priv->parent_source;
- last_source = source->priv->parent_source->prev;
+ prev = source->priv->parent_source->prev;
+ next = source->priv->parent_source;
}
else
{
- 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;
- }
+ prev = source_list->tail;
+ next = NULL;
}
- source->next = tmp_source;
- if (tmp_source)
- tmp_source->prev = source;
+ source->next = next;
+ if (next)
+ next->prev = source;
+ else
+ source_list->tail = source;
- source->prev = last_source;
- if (last_source)
- last_source->next = source;
+ source->prev = prev;
+ if (prev)
+ prev->next = source;
else
- context->source_list = source;
+ source_list->head = source;
}
/* Holds context's lock
*/
static void
-g_source_list_remove (GSource *source,
- GMainContext *context)
+source_remove_from_context (GSource *source,
+ GMainContext *context)
{
+ GSourceList *source_list;
+
+ source_list = find_source_list_for_priority (context, source->priority, FALSE);
+ g_return_if_fail (source_list != NULL);
+
if (source->prev)
source->prev->next = source->next;
else
- context->source_list = source->next;
+ source_list->head = source->next;
if (source->next)
source->next->prev = source->prev;
+ else
+ source_list->tail = source->prev;
source->prev = NULL;
source->next = NULL;
+
+ if (source_list->head == NULL)
+ {
+ context->source_lists = g_list_remove (context->source_lists, source_list);
+ g_slice_free (GSourceList, source_list);
+ }
+
+ if (context->overflow_used_source_ids)
+ g_hash_table_remove (context->overflow_used_source_ids,
+ GUINT_TO_POINTER (source->source_id));
+
+}
+
+static void
+assign_source_id_unlocked (GMainContext *context,
+ GSource *source)
+{
+ guint id;
+
+ /* Are we about to overflow back to 0?
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=687098
+ */
+ if (G_UNLIKELY (context->next_id == G_MAXUINT &&
+ context->overflow_used_source_ids == NULL))
+ {
+ GSourceIter iter;
+ GSource *source;
+
+ context->overflow_used_source_ids = g_hash_table_new (NULL, NULL);
+
+ g_source_iter_init (&iter, context, FALSE);
+ while (g_source_iter_next (&iter, &source))
+ {
+ g_hash_table_add (context->overflow_used_source_ids,
+ GUINT_TO_POINTER (source->source_id));
+ }
+ id = G_MAXUINT;
+ }
+ else if (context->overflow_used_source_ids == NULL)
+ {
+ id = context->next_id++;
+ }
+ else
+ {
+ /*
+ * If we overran G_MAXUINT, we fall back to randomly probing the
+ * source ids for the current context. This will be slower the more
+ * sources there are, but we're mainly concerned right now about
+ * correctness and code size. There's time for a more clever solution
+ * later.
+ */
+ do
+ id = g_random_int ();
+ while (id == 0 ||
+ g_hash_table_contains (context->overflow_used_source_ids,
+ GUINT_TO_POINTER (id)));
+ g_hash_table_add (context->overflow_used_source_ids, GUINT_TO_POINTER (id));
+ }
+
+ source->source_id = id;
}
static guint
g_source_attach_unlocked (GSource *source,
- GMainContext *context)
+ GMainContext *context,
+ gboolean do_wakeup)
{
- guint result = 0;
GSList *tmp_list;
source->context = context;
- result = source->source_id = context->next_id++;
-
+ assign_source_id_unlocked (context, source);
source->ref_count++;
- g_source_list_add (source, context);
+ source_add_to_context (source, context);
- tmp_list = source->poll_fds;
- while (tmp_list)
+ if (!SOURCE_BLOCKED (source))
{
- g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data);
- tmp_list = tmp_list->next;
+ 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;
+ }
+
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data);
}
- if (source->priv)
+ tmp_list = source->priv->child_sources;
+ while (tmp_list)
{
- tmp_list = source->priv->child_sources;
- while (tmp_list)
- {
- g_source_attach_unlocked (tmp_list->data, context);
- tmp_list = tmp_list->next;
- }
+ g_source_attach_unlocked (tmp_list->data, context, FALSE);
+ tmp_list = tmp_list->next;
}
- return result;
+ /* If another thread has acquired the context, wake it up since it
+ * might be in poll() right now.
+ */
+ if (do_wakeup && context->owner && context->owner != G_THREAD_SELF)
+ g_wakeup_signal (context->wakeup);
+
+ return source->source_id;
}
/**
@@ -916,13 +1174,7 @@ g_source_attach (GSource *source,
LOCK_CONTEXT (context);
- result = g_source_attach_unlocked (source, context);
-
- /* If another thread has acquired the context, wake it up since it
- * might be in poll() right now.
- */
- if (context->owner && context->owner != G_THREAD_SELF)
- g_wakeup_signal (context->wakeup);
+ result = g_source_attach_unlocked (source, context, TRUE);
UNLOCK_CONTEXT (context);
@@ -966,25 +1218,16 @@ g_source_destroy_internal (GSource *source,
g_main_context_remove_poll_unlocked (context, tmp_list->data);
tmp_list = tmp_list->next;
}
- }
- if (source->priv && source->priv->child_sources)
- {
- /* This is safe because even if a child_source finalizer or
- * closure notify tried to modify source->priv->child_sources
- * from outside the lock, it would fail since
- * SOURCE_DESTROYED(source) is now TRUE.
- */
- tmp_list = source->priv->child_sources;
- while (tmp_list)
- {
- g_source_destroy_internal (tmp_list->data, context, TRUE);
- g_source_unref_internal (tmp_list->data, context, TRUE);
- tmp_list = tmp_list->next;
- }
- g_slist_free (source->priv->child_sources);
- source->priv->child_sources = NULL;
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ g_main_context_remove_poll_unlocked (context, tmp_list->data);
}
+
+ while (source->priv->child_sources)
+ g_child_source_remove_internal (source->priv->child_sources->data, context);
+
+ if (source->priv->parent_source)
+ g_child_source_remove_internal (source, context);
g_source_unref_internal (source, context, TRUE);
}
@@ -1047,7 +1290,13 @@ g_source_get_id (GSource *source)
* @source: a #GSource
*
* Gets the #GMainContext with which the source is associated.
- * Calling this function on a destroyed source is an error.
+ *
+ * You can call this on a source that has been destroyed, provided
+ * that the #GMainContext it was attached to still exists (in which
+ * case it will return that #GMainContext). In particular, you can
+ * always call this function on the source returned from
+ * g_main_current_source(). But calling this function on a source
+ * whose #GMainContext has been destroyed is an error.
*
* Return value: (transfer none) (allow-none): the #GMainContext with which the
* source is associated, or %NULL if the context has not
@@ -1056,7 +1305,7 @@ g_source_get_id (GSource *source)
GMainContext *
g_source_get_context (GSource *source)
{
- g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL);
+ g_return_val_if_fail (source->context != NULL || !SOURCE_DESTROYED (source), NULL);
return source->context;
}
@@ -1066,12 +1315,16 @@ g_source_get_context (GSource *source)
* @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.
+ *
+ * Using this API forces the linear scanning of event sources on each
+ * main loop iteration. Newly-written event sources should try to use
+ * g_source_add_unix_fd() instead of this API.
**/
void
g_source_add_poll (GSource *source,
@@ -1164,30 +1417,41 @@ g_source_add_child_source (GSource *source,
g_return_if_fail (!SOURCE_DESTROYED (source));
g_return_if_fail (!SOURCE_DESTROYED (child_source));
g_return_if_fail (child_source->context == NULL);
- g_return_if_fail (child_source->priv == NULL || child_source->priv->parent_source == NULL);
+ g_return_if_fail (child_source->priv->parent_source == NULL);
context = source->context;
if (context)
LOCK_CONTEXT (context);
- if (!source->priv)
- source->priv = g_slice_new0 (GSourcePrivate);
- if (!child_source->priv)
- child_source->priv = g_slice_new0 (GSourcePrivate);
-
source->priv->child_sources = g_slist_prepend (source->priv->child_sources,
g_source_ref (child_source));
child_source->priv->parent_source = source;
g_source_set_priority_unlocked (child_source, NULL, source->priority);
+ if (SOURCE_BLOCKED (source))
+ block_source (child_source);
if (context)
{
+ g_source_attach_unlocked (child_source, context, TRUE);
UNLOCK_CONTEXT (context);
- g_source_attach (child_source, context);
}
}
+static void
+g_child_source_remove_internal (GSource *child_source,
+ GMainContext *context)
+{
+ GSource *parent_source = child_source->priv->parent_source;
+
+ parent_source->priv->child_sources =
+ g_slist_remove (parent_source->priv->child_sources, child_source);
+ child_source->priv->parent_source = NULL;
+
+ g_source_destroy_internal (child_source, context, TRUE);
+ g_source_unref_internal (child_source, context, TRUE);
+}
+
/**
* g_source_remove_child_source:
* @source:a #GSource
@@ -1206,7 +1470,7 @@ g_source_remove_child_source (GSource *source,
g_return_if_fail (source != NULL);
g_return_if_fail (child_source != NULL);
- g_return_if_fail (child_source->priv != NULL && child_source->priv->parent_source == source);
+ g_return_if_fail (child_source->priv->parent_source == source);
g_return_if_fail (!SOURCE_DESTROYED (source));
g_return_if_fail (!SOURCE_DESTROYED (child_source));
@@ -1215,9 +1479,7 @@ g_source_remove_child_source (GSource *source,
if (context)
LOCK_CONTEXT (context);
- source->priv->child_sources = g_slist_remove (source->priv->child_sources, child_source);
- g_source_destroy_internal (child_source, context, TRUE);
- g_source_unref_internal (child_source, context, TRUE);
+ g_child_source_remove_internal (child_source, context);
if (context)
UNLOCK_CONTEXT (context);
@@ -1375,15 +1637,22 @@ g_source_set_priority_unlocked (GSource *source,
{
GSList *tmp_list;
- source->priority = priority;
+ g_return_if_fail (source->priv->parent_source == NULL ||
+ source->priv->parent_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 place
+ * add it back after so it is sorted in the correct place
*/
- g_source_list_remove (source, source->context);
- g_source_list_add (source, source->context);
+ source_remove_from_context (source, source->context);
+ }
+
+ source->priority = priority;
+
+ if (context)
+ {
+ source_add_to_context (source, source->context);
if (!SOURCE_BLOCKED (source))
{
@@ -1395,10 +1664,16 @@ g_source_set_priority_unlocked (GSource *source,
tmp_list = tmp_list->next;
}
+
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ {
+ g_main_context_remove_poll_unlocked (context, tmp_list->data);
+ g_main_context_add_poll_unlocked (context, priority, tmp_list->data);
+ }
}
}
- if (source->priv && source->priv->child_sources)
+ if (source->priv->child_sources)
{
tmp_list = source->priv->child_sources;
while (tmp_list)
@@ -1453,6 +1728,79 @@ g_source_get_priority (GSource *source)
}
/**
+ * g_source_set_ready_time:
+ * @source: a #GSource
+ * @ready_time: the monotonic time at which the source will be ready,
+ * 0 for "immediately", -1 for "never"
+ *
+ * Sets a #GSource to be dispatched when the given monotonic time is
+ * reached (or passed). If the monotonic time is in the past (as it
+ * always will be if @ready_time is 0) then the source will be
+ * dispatched immediately.
+ *
+ * If @ready_time is -1 then the source is never woken up on the basis
+ * of the passage of time.
+ *
+ * Dispatching the source does not reset the ready time. You should do
+ * so yourself, from the source dispatch function.
+ *
+ * Note that if you have a pair of sources where the ready time of one
+ * suggests that it will be delivered first but the priority for the
+ * other suggests that it would be delivered first, and the ready time
+ * for both sources is reached during the same main context iteration
+ * then the order of dispatch is undefined.
+ *
+ * Since: 2.36
+ **/
+void
+g_source_set_ready_time (GSource *source,
+ gint64 ready_time)
+{
+ GMainContext *context;
+
+ g_return_if_fail (source != NULL);
+ g_return_if_fail (source->ref_count > 0);
+
+ if (source->priv->ready_time == ready_time)
+ return;
+
+ context = source->context;
+
+ if (context)
+ LOCK_CONTEXT (context);
+
+ source->priv->ready_time = ready_time;
+
+ if (context)
+ {
+ /* Quite likely that we need to change the timeout on the poll */
+ if (!SOURCE_BLOCKED (source))
+ g_wakeup_signal (context->wakeup);
+ UNLOCK_CONTEXT (context);
+ }
+}
+
+/**
+ * g_source_get_ready_time:
+ * @source: a #GSource
+ *
+ * Gets the "ready time" of @source, as set by
+ * g_source_set_ready_time().
+ *
+ * Any time before the current monotonic time (including 0) is an
+ * indication that the source will fire immediately.
+ *
+ * Returns: the monotonic ready time, -1 for "never"
+ **/
+gint64
+g_source_get_ready_time (GSource *source)
+{
+ g_return_val_if_fail (source != NULL, -1);
+
+ return source->priv->ready_time;
+}
+
+/**
* g_source_set_can_recurse:
* @source: a #GSource
* @can_recurse: whether recursion is allowed for this source
@@ -1639,7 +1987,7 @@ g_source_unref_internal (GSource *source,
{
if (!SOURCE_DESTROYED (source))
g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!");
- g_source_list_remove (source, context);
+ source_remove_from_context (source, context);
}
if (source->source_funcs->finalize)
@@ -1657,11 +2005,10 @@ g_source_unref_internal (GSource *source,
g_slist_free (source->poll_fds);
source->poll_fds = NULL;
- if (source->priv)
- {
- g_slice_free (GSourcePrivate, source->priv);
- source->priv = NULL;
- }
+ g_slist_free_full (source->priv->fds, g_free);
+
+ g_slice_free (GSourcePrivate, source->priv);
+ source->priv = NULL;
g_free (source);
}
@@ -1710,6 +2057,7 @@ GSource *
g_main_context_find_source_by_id (GMainContext *context,
guint source_id)
{
+ GSourceIter iter;
GSource *source;
g_return_val_if_fail (source_id > 0, NULL);
@@ -1719,14 +2067,14 @@ g_main_context_find_source_by_id (GMainContext *context,
LOCK_CONTEXT (context);
- source = context->source_list;
- while (source)
+ g_source_iter_init (&iter, context, FALSE);
+ while (g_source_iter_next (&iter, &source))
{
if (!SOURCE_DESTROYED (source) &&
source->source_id == source_id)
break;
- source = source->next;
}
+ g_source_iter_clear (&iter);
UNLOCK_CONTEXT (context);
@@ -1750,6 +2098,7 @@ g_main_context_find_source_by_funcs_user_data (GMainContext *context,
GSourceFuncs *funcs,
gpointer user_data)
{
+ GSourceIter iter;
GSource *source;
g_return_val_if_fail (funcs != NULL, NULL);
@@ -1759,8 +2108,8 @@ g_main_context_find_source_by_funcs_user_data (GMainContext *context,
LOCK_CONTEXT (context);
- source = context->source_list;
- while (source)
+ g_source_iter_init (&iter, context, FALSE);
+ while (g_source_iter_next (&iter, &source))
{
if (!SOURCE_DESTROYED (source) &&
source->source_funcs == funcs &&
@@ -1774,8 +2123,8 @@ g_main_context_find_source_by_funcs_user_data (GMainContext *context,
if (callback_data == user_data)
break;
}
- source = source->next;
}
+ g_source_iter_clear (&iter);
UNLOCK_CONTEXT (context);
@@ -1797,6 +2146,7 @@ GSource *
g_main_context_find_source_by_user_data (GMainContext *context,
gpointer user_data)
{
+ GSourceIter iter;
GSource *source;
if (context == NULL)
@@ -1804,8 +2154,8 @@ g_main_context_find_source_by_user_data (GMainContext *context,
LOCK_CONTEXT (context);
- source = context->source_list;
- while (source)
+ g_source_iter_init (&iter, context, FALSE);
+ while (g_source_iter_next (&iter, &source))
{
if (!SOURCE_DESTROYED (source) &&
source->callback_funcs)
@@ -1818,8 +2168,8 @@ g_main_context_find_source_by_user_data (GMainContext *context,
if (callback_data == user_data)
break;
}
- source = source->next;
}
+ g_source_iter_clear (&iter);
UNLOCK_CONTEXT (context);
@@ -1910,6 +2260,174 @@ g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
return FALSE;
}
+#ifdef G_OS_UNIX
+/**
+ * g_source_add_unix_fd:
+ * @source: a #GSource
+ * @fd: the fd to monitor
+ * @events: an event mask
+ *
+ * Monitors @fd for the IO events in @events.
+ *
+ * The tag returned by this function can be used to remove or modify the
+ * monitoring of the fd using g_source_remove_unix_fd() or
+ * g_source_modify_unix_fd().
+ *
+ * It is not necessary to remove the fd before destroying the source; it
+ * will be cleaned up automatically.
+ *
+ * As the name suggests, this function is not available on Windows.
+ *
+ * Returns: an opaque tag
+ *
+ * Since: 2.36
+ **/
+gpointer
+g_source_add_unix_fd (GSource *source,
+ gint fd,
+ GIOCondition events)
+{
+ GMainContext *context;
+ GPollFD *poll_fd;
+
+ g_return_val_if_fail (source != NULL, NULL);
+ g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL);
+
+ poll_fd = g_new (GPollFD, 1);
+ poll_fd->fd = fd;
+ poll_fd->events = events;
+ poll_fd->revents = 0;
+
+ context = source->context;
+
+ if (context)
+ LOCK_CONTEXT (context);
+
+ source->priv->fds = g_slist_prepend (source->priv->fds, poll_fd);
+
+ if (context)
+ {
+ if (!SOURCE_BLOCKED (source))
+ g_main_context_add_poll_unlocked (context, source->priority, poll_fd);
+ UNLOCK_CONTEXT (context);
+ }
+
+ return poll_fd;
+}
+
+/**
+ * g_source_modify_unix_fd:
+ * @source: a #GSource
+ * @tag: the tag from g_source_add_unix_fd()
+ * @new_events: the new event mask to watch
+ *
+ * Updates the event mask to watch for the fd identified by @tag.
+ *
+ * @tag is the tag returned from g_source_add_unix_fd().
+ *
+ * If you want to remove a fd, don't set its event mask to zero.
+ * Instead, call g_source_remove_unix_fd().
+ *
+ * As the name suggests, this function is not available on Windows.
+ *
+ * Since: 2.36
+ **/
+void
+g_source_modify_unix_fd (GSource *source,
+ gpointer tag,
+ GIOCondition new_events)
+{
+ GMainContext *context;
+ GPollFD *poll_fd;
+
+ g_return_if_fail (source != NULL);
+ g_return_if_fail (g_slist_find (source->priv->fds, tag));
+
+ context = source->context;
+ poll_fd = tag;
+
+ poll_fd->events = new_events;
+
+ if (context)
+ g_main_context_wakeup (context);
+}
+
+/**
+ * g_source_remove_unix_fd:
+ * @source: a #GSource
+ * @tag: the tag from g_source_add_unix_fd()
+ *
+ * Reverses the effect of a previous call to g_source_add_unix_fd().
+ *
+ * You only need to call this if you want to remove an fd from being
+ * watched while keeping the same source around. In the normal case you
+ * will just want to destroy the source.
+ *
+ * As the name suggests, this function is not available on Windows.
+ *
+ * Since: 2.36
+ **/
+void
+g_source_remove_unix_fd (GSource *source,
+ gpointer tag)
+{
+ GMainContext *context;
+ GPollFD *poll_fd;
+
+ g_return_if_fail (source != NULL);
+ g_return_if_fail (g_slist_find (source->priv->fds, tag));
+
+ context = source->context;
+ poll_fd = tag;
+
+ if (context)
+ LOCK_CONTEXT (context);
+
+ source->priv->fds = g_slist_remove (source->priv->fds, poll_fd);
+
+ if (context)
+ {
+ if (!SOURCE_BLOCKED (source))
+ g_main_context_remove_poll_unlocked (context, poll_fd);
+
+ UNLOCK_CONTEXT (context);
+ }
+
+ g_free (poll_fd);
+}
+
+/**
+ * g_source_query_unix_fd:
+ * @source: a #GSource
+ * @tag: the tag from g_source_add_unix_fd()
+ *
+ * Queries the events reported for the fd corresponding to @tag on
+ * @source during the last poll.
+ *
+ * The return value of this function is only defined when the function
+ * is called from the check or dispatch functions for @source.
+ *
+ * As the name suggests, this function is not available on Windows.
+ *
+ * Returns: the conditions reported on the fd
+ *
+ * Since: 2.36
+ **/
+GIOCondition
+g_source_query_unix_fd (GSource *source,
+ gpointer tag)
+{
+ GPollFD *poll_fd;
+
+ g_return_val_if_fail (source != NULL, 0);
+ g_return_val_if_fail (g_slist_find (source->priv->fds, tag), 0);
+
+ poll_fd = tag;
+
+ return poll_fd->revents;
+}
+#endif /* G_OS_UNIX */
+
/**
* g_get_current_time:
* @result: #GTimeVal structure in which to store current time.
@@ -1982,7 +2500,7 @@ g_get_real_time (void)
static ULONGLONG (*g_GetTickCount64) (void) = NULL;
static guint32 g_win32_tick_epoch = 0;
-G_GNUC_INTERNAL void
+void
g_clock_win32_init (void)
{
HMODULE kernel32;
@@ -2428,11 +2946,17 @@ block_source (GSource *source)
source->flags |= G_SOURCE_BLOCKED;
- tmp_list = source->poll_fds;
- while (tmp_list)
+ if (source->context)
{
- g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
- tmp_list = tmp_list->next;
+ tmp_list = source->poll_fds;
+ while (tmp_list)
+ {
+ g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
+ tmp_list = tmp_list->next;
+ }
+
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
}
if (source->priv && source->priv->child_sources)
@@ -2451,7 +2975,7 @@ 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));
@@ -2464,6 +2988,9 @@ unblock_source (GSource *source)
tmp_list = tmp_list->next;
}
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data);
+
if (source->priv && source->priv->child_sources)
{
tmp_list = source->priv->child_sources;
@@ -2570,30 +3097,6 @@ g_main_dispatch (GMainContext *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
@@ -2769,6 +3272,7 @@ g_main_context_prepare (GMainContext *context,
gint n_ready = 0;
gint current_priority = G_MAXINT;
GSource *source;
+ GSourceIter iter;
if (context == NULL)
context = g_main_context_default ();
@@ -2810,33 +3314,64 @@ g_main_context_prepare (GMainContext *context,
context->timeout = -1;
- source = next_valid_source (context, NULL);
- while (source)
+ g_source_iter_init (&iter, context, TRUE);
+ while (g_source_iter_next (&iter, &source))
{
gint source_timeout = -1;
+ if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source))
+ continue;
if ((n_ready > 0) && (source->priority > current_priority))
- {
- SOURCE_UNREF (source, context);
- break;
- }
- if (SOURCE_BLOCKED (source))
- goto next;
+ break;
if (!(source->flags & G_SOURCE_READY))
{
gboolean result;
- gboolean (*prepare) (GSource *source,
- gint *timeout);
+ gboolean (* prepare) (GSource *source,
+ gint *timeout);
- prepare = source->source_funcs->prepare;
- context->in_check_or_prepare++;
- UNLOCK_CONTEXT (context);
+ prepare = source->source_funcs->prepare;
- result = (*prepare) (source, &source_timeout);
+ if (prepare)
+ {
+ context->in_check_or_prepare++;
+ UNLOCK_CONTEXT (context);
- LOCK_CONTEXT (context);
- context->in_check_or_prepare--;
+ result = (* prepare) (source, &source_timeout);
+
+ LOCK_CONTEXT (context);
+ context->in_check_or_prepare--;
+ }
+ else
+ {
+ source_timeout = -1;
+ result = FALSE;
+ }
+
+ if (result == FALSE && source->priv->ready_time != -1)
+ {
+ if (!context->time_is_fresh)
+ {
+ context->time = g_get_monotonic_time ();
+ context->time_is_fresh = TRUE;
+ }
+
+ if (source->priv->ready_time <= context->time)
+ {
+ source_timeout = 0;
+ result = TRUE;
+ }
+ else
+ {
+ gint timeout;
+
+ /* rounding down will lead to spinning, so always round up */
+ timeout = (source->priv->ready_time - context->time + 999) / 1000;
+
+ if (source_timeout < 0 || timeout < source_timeout)
+ source_timeout = timeout;
+ }
+ }
if (result)
{
@@ -2845,7 +3380,7 @@ g_main_context_prepare (GMainContext *context,
while (ready_source)
{
ready_source->flags |= G_SOURCE_READY;
- ready_source = ready_source->priv ? ready_source->priv->parent_source : NULL;
+ ready_source = ready_source->priv->parent_source;
}
}
}
@@ -2864,10 +3399,8 @@ g_main_context_prepare (GMainContext *context,
else
context->timeout = MIN (context->timeout, source_timeout);
}
-
- next:
- source = next_valid_source (context, source);
}
+ g_source_iter_clear (&iter);
UNLOCK_CONTEXT (context);
@@ -2962,6 +3495,7 @@ g_main_context_check (GMainContext *context,
gint n_fds)
{
GSource *source;
+ GSourceIter iter;
GPollRec *pollrec;
gint n_ready = 0;
gint i;
@@ -2999,32 +3533,67 @@ g_main_context_check (GMainContext *context,
i++;
}
- source = next_valid_source (context, NULL);
- while (source)
+ g_source_iter_init (&iter, context, TRUE);
+ while (g_source_iter_next (&iter, &source))
{
+ if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source))
+ continue;
if ((n_ready > 0) && (source->priority > max_priority))
- {
- SOURCE_UNREF (source, context);
- break;
- }
- if (SOURCE_BLOCKED (source))
- goto next;
+ break;
if (!(source->flags & G_SOURCE_READY))
{
- gboolean result;
- gboolean (*check) (GSource *source);
+ gboolean result;
+ gboolean (* check) (GSource *source);
+
+ check = source->source_funcs->check;
+
+ if (check)
+ {
+ /* If the check function is set, call it. */
+ context->in_check_or_prepare++;
+ UNLOCK_CONTEXT (context);
+
+ result = (* check) (source);
+
+ LOCK_CONTEXT (context);
+ context->in_check_or_prepare--;
+ }
+ else
+ result = FALSE;
+
+ if (result == FALSE)
+ {
+ GSList *tmp_list;
+
+ /* If not already explicitly flagged ready by ->check()
+ * (or if we have no check) then we can still be ready if
+ * any of our fds poll as ready.
+ */
+ for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
+ {
+ GPollFD *pollfd = tmp_list->data;
+
+ if (pollfd->revents)
+ {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (result == FALSE && source->priv->ready_time != -1)
+ {
+ if (!context->time_is_fresh)
+ {
+ context->time = g_get_monotonic_time ();
+ context->time_is_fresh = TRUE;
+ }
+
+ if (source->priv->ready_time <= context->time)
+ result = TRUE;
+ }
- 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)
{
GSource *ready_source = source;
@@ -3032,7 +3601,7 @@ g_main_context_check (GMainContext *context,
while (ready_source)
{
ready_source->flags |= G_SOURCE_READY;
- ready_source = ready_source->priv ? ready_source->priv->parent_source : NULL;
+ ready_source = ready_source->priv->parent_source;
}
}
}
@@ -3049,10 +3618,8 @@ g_main_context_check (GMainContext *context,
*/
max_priority = source->priority;
}
-
- next:
- source = next_valid_source (context, source);
}
+ g_source_iter_clear (&iter);
UNLOCK_CONTEXT (context);
@@ -3179,20 +3746,20 @@ g_main_context_pending (GMainContext *context)
* g_main_context_iteration:
* @context: (allow-none): 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. Otherwise, if @may_block is %FALSE
- * sources are not waited to become ready, only those highest priority
- * events sources will be dispatched (if any), that are ready at this
+ * events sources that are ready. Otherwise, if @may_block is %FALSE
+ * sources are not waited to become ready, only those highest priority
+ * events sources will be dispatched (if any), that are ready at this
* given moment without further waiting.
*
- * 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
+ * Note that even when @may_block is %TRUE, it is still possible for
+ * g_main_context_iteration() to return %FALSE, since the wait may
* be interrupted for other reasons than an event source becoming ready.
- *
+ *
* Return value: %TRUE if events were dispatched.
**/
gboolean
@@ -3503,10 +4070,10 @@ g_main_context_poll (GMainContext *context,
* @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 seldom be used directly. Instead
- * a typical event source will use g_source_add_poll() instead.
+ * a typical event source will use g_source_add_unix_fd() instead.
**/
void
g_main_context_add_poll (GMainContext *context,
@@ -3748,8 +4315,34 @@ g_main_context_get_poll_func (GMainContext *context)
* g_main_context_wakeup:
* @context: a #GMainContext
*
- * If @context is currently waiting in a poll(), interrupt
- * the poll(), and continue the iteration process.
+ * If @context is currently blocking in g_main_context_iteration()
+ * waiting for a source to become ready, cause it to stop blocking
+ * and return. Otherwise, cause the next invocation of
+ * g_main_context_iteration() to return without blocking.
+ *
+ * This API is useful for low-level control over #GMainContext; for
+ * example, integrating it with main loop implementations such as
+ * #GMainLoop.
+ *
+ * Another related use for this function is when implementing a main
+ * loop with a termination condition, computed from multiple threads:
+ *
+ * |[
+ * #define NUM_TASKS 10
+ * static volatile gint tasks_remaining = NUM_TASKS;
+ * ...
+ *
+ * while (g_atomic_int_get (&tasks_remaining) != 0)
+ * g_main_context_iteration (NULL, TRUE);
+ * ]|
+ *
+ * Then in a thread:
+ * |[
+ * perform_work();
+ *
+ * if (g_atomic_int_dec_and_test (&tasks_remaining))
+ * g_main_context_wakeup (NULL);
+ * ]|
**/
void
g_main_context_wakeup (GMainContext *context)
@@ -3796,8 +4389,9 @@ static void
g_timeout_set_expiration (GTimeoutSource *timeout_source,
gint64 current_time)
{
- timeout_source->expiration = current_time +
- (guint64) timeout_source->interval * 1000;
+ gint64 expiration;
+
+ expiration = current_time + (guint64) timeout_source->interval * 1000;
if (timeout_source->seconds)
{
@@ -3826,42 +4420,17 @@ g_timeout_set_expiration (GTimeoutSource *timeout_source,
* always only *increase* the expiration time by adding a full
* second in the case that the microsecond portion decreases.
*/
- timeout_source->expiration -= timer_perturb;
+ expiration -= timer_perturb;
- remainder = timeout_source->expiration % 1000000;
+ remainder = expiration % 1000000;
if (remainder >= 1000000/4)
- timeout_source->expiration += 1000000;
-
- timeout_source->expiration -= remainder;
- timeout_source->expiration += timer_perturb;
- }
-}
-
-static gboolean
-g_timeout_prepare (GSource *source,
- gint *timeout)
-{
- GTimeoutSource *timeout_source = (GTimeoutSource *) source;
- gint64 now = g_source_get_time (source);
+ expiration += 1000000;
- if (now < timeout_source->expiration)
- {
- /* Round up to ensure that we don't try again too early */
- *timeout = (timeout_source->expiration - now + 999) / 1000;
- return FALSE;
+ expiration -= remainder;
+ expiration += timer_perturb;
}
- *timeout = 0;
- return TRUE;
-}
-
-static gboolean
-g_timeout_check (GSource *source)
-{
- GTimeoutSource *timeout_source = (GTimeoutSource *) source;
- gint64 now = g_source_get_time (source);
-
- return timeout_source->expiration <= now;
+ g_source_set_ready_time ((GSource *) timeout_source, expiration);
}
static gboolean
@@ -4261,8 +4830,6 @@ dispatch_unix_signals (void)
/* handle GChildWatchSource instances */
if (unix_signal_pending[SIGCHLD])
{
- unix_signal_pending[SIGCHLD] = FALSE;
-
/* The only way we can do this is to scan all of the children.
*
* The docs promise that we will not reap children that we are not
@@ -4277,12 +4844,24 @@ dispatch_unix_signals (void)
if (!source->child_exited)
{
- if (waitpid (source->pid, &source->child_status, WNOHANG) > 0)
+ pid_t pid;
+ do
{
- source->child_exited = TRUE;
-
- wake_source ((GSource *) source);
+ pid = waitpid (source->pid, &source->child_status, WNOHANG);
+ if (pid > 0)
+ {
+ source->child_exited = TRUE;
+ wake_source ((GSource *) source);
+ }
+ else if (pid == -1 && errno == ECHILD)
+ {
+ g_warning ("GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_child_watch_add()/g_spawn_sync() either directly or indirectly.");
+ source->child_exited = TRUE;
+ source->child_status = 0;
+ wake_source ((GSource *) source);
+ }
}
+ while (pid == -1 && errno == EINTR);
}
}
}
@@ -4296,7 +4875,6 @@ dispatch_unix_signals (void)
{
if (unix_signal_pending[source->signum])
{
- unix_signal_pending[source->signum] = FALSE;
source->pending = TRUE;
wake_source ((GSource *) source);
@@ -4304,6 +4882,8 @@ dispatch_unix_signals (void)
}
}
+ memset ((void*)unix_signal_pending, 0, sizeof (unix_signal_pending));
+
G_UNLOCK(unix_signal_lock);
}
@@ -4355,6 +4935,7 @@ g_unix_signal_watch_dispatch (GSource *source,
gpointer user_data)
{
GUnixSignalWatchSource *unix_signal_source;
+ gboolean again;
unix_signal_source = (GUnixSignalWatchSource *) source;
@@ -4365,36 +4946,40 @@ g_unix_signal_watch_dispatch (GSource *source,
return FALSE;
}
- (callback) (user_data);
+ again = (callback) (user_data);
unix_signal_source->pending = FALSE;
- return TRUE;
+ return again;
}
static void
-ensure_unix_signal_handler_installed_unlocked (int signum)
+ref_unix_signal_handler_unlocked (int signum)
{
- static sigset_t installed_signal_mask;
- static gboolean initialized;
- struct sigaction action;
-
- if (!initialized)
+ /* Ensure we have the worker context */
+ g_get_worker_context ();
+ unix_signal_refcount[signum]++;
+ if (unix_signal_refcount[signum] == 1)
{
- sigemptyset (&installed_signal_mask);
- g_get_worker_context ();
- initialized = TRUE;
+ struct sigaction action;
+ action.sa_handler = g_unix_signal_handler;
+ sigemptyset (&action.sa_mask);
+ action.sa_flags = SA_RESTART | SA_NOCLDSTOP;
+ sigaction (signum, &action, NULL);
}
+}
- if (sigismember (&installed_signal_mask, signum))
- return;
-
- sigaddset (&installed_signal_mask, signum);
-
- action.sa_handler = g_unix_signal_handler;
- sigemptyset (&action.sa_mask);
- action.sa_flags = SA_RESTART | SA_NOCLDSTOP;
- sigaction (signum, &action, NULL);
+static void
+unref_unix_signal_handler_unlocked (int signum)
+{
+ unix_signal_refcount[signum]--;
+ if (unix_signal_refcount[signum] == 0)
+ {
+ struct sigaction action;
+ action.sa_handler = SIG_DFL;
+ sigemptyset (&action.sa_mask);
+ sigaction (signum, &action, NULL);
+ }
}
GSource *
@@ -4410,11 +4995,10 @@ _g_main_create_unix_signal_watch (int signum)
unix_signal_source->pending = FALSE;
G_LOCK (unix_signal_lock);
- ensure_unix_signal_handler_installed_unlocked (signum);
+ ref_unix_signal_handler_unlocked (signum);
unix_signal_watches = g_slist_prepend (unix_signal_watches, unix_signal_source);
if (unix_signal_pending[signum])
unix_signal_source->pending = TRUE;
- unix_signal_pending[signum] = FALSE;
G_UNLOCK (unix_signal_lock);
return source;
@@ -4423,7 +5007,12 @@ _g_main_create_unix_signal_watch (int signum)
static void
g_unix_signal_watch_finalize (GSource *source)
{
+ GUnixSignalWatchSource *unix_signal_source;
+
+ unix_signal_source = (GUnixSignalWatchSource *) source;
+
G_LOCK (unix_signal_lock);
+ unref_unix_signal_handler_unlocked (unix_signal_source->signum);
unix_signal_watches = g_slist_remove (unix_signal_watches, source);
G_UNLOCK (unix_signal_lock);
}
@@ -4433,6 +5022,7 @@ g_child_watch_finalize (GSource *source)
{
G_LOCK (unix_signal_lock);
unix_child_watches = g_slist_remove (unix_child_watches, source);
+ unref_unix_signal_handler_unlocked (SIGCHLD);
G_UNLOCK (unix_signal_lock);
}
@@ -4494,10 +5084,10 @@ g_unix_signal_handler (int signum)
* 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.
+ * Note further that using g_child_watch_source_new() is not
+ * compatible with calling <literal>waitpid</literal> with a
+ * nonpositive first argument in the application. Calling waitpid()
+ * for individual pids will still work fine.
*
* Return value: the newly-created child watch source
*
@@ -4518,7 +5108,7 @@ g_child_watch_source_new (GPid pid)
g_source_add_poll (source, &child_watch_source->poll);
#else /* G_OS_WIN32 */
G_LOCK (unix_signal_lock);
- ensure_unix_signal_handler_installed_unlocked (SIGCHLD);
+ ref_unix_signal_handler_unlocked (SIGCHLD);
unix_child_watches = g_slist_prepend (unix_child_watches, child_watch_source);
if (waitpid (pid, &child_watch_source->child_status, WNOHANG) > 0)
child_watch_source->child_exited = TRUE;
@@ -4544,11 +5134,15 @@ g_child_watch_source_new (GPid pid)
* 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.
+ *
+ * In many programs, you will want to call g_spawn_check_exit_status()
+ * in the callback to determine whether or not the child exited
+ * successfully.
*
- * 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.
+ * Also, 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 should invoke g_spawn_close_pid()
+ * in the callback function for the source.
*
* GLib supports only a single callback per process id.
*
diff --git a/glib/glib/gmain.h b/glib/glib/gmain.h
index fadf7fc..c455353 100644
--- a/glib/glib/gmain.h
+++ b/glib/glib/gmain.h
@@ -17,19 +17,30 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_MAIN_H__
+#define __G_MAIN_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MAIN_H__
-#define __G_MAIN_H__
-
#include <glib/gpoll.h>
#include <glib/gslist.h>
#include <glib/gthread.h>
G_BEGIN_DECLS
+typedef enum /*< flags >*/
+{
+ 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;
+
+
/**
* GMainContext:
*
@@ -74,12 +85,18 @@ typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs;
* results of the poll() 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 poll() 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.
+ * be -1 if all sources returned -1, or it will be the minimum of all
+ * the @timeout_ values returned which were >= 0. Since 2.36 this may
+ * be %NULL, in which case the effect is as if the function always returns
+ * %FALSE with a timeout of -1. If @prepare returns a
+ * timeout and the source also has a 'ready time' set then the
+ * nearer of the two will be used.
* @check: 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.
+ * so the source should be checked again here. Since 2.36 this may
+ * be %NULL, in which case the effect is as if the function always returns
+ * %FALSE.
* @dispatch: 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
@@ -132,18 +149,21 @@ typedef struct _GSourceFuncs GSourceFuncs;
* Specifies the type of function passed to g_timeout_add(),
* g_timeout_add_full(), g_idle_add(), and g_idle_add_full().
*
- * Returns: %FALSE if the source should be removed
+ * Returns: %FALSE if the source should be removed. #G_SOURCE_CONTINUE and
+ * #G_SOURCE_REMOVE are more memorable names for the return value.
*/
typedef gboolean (*GSourceFunc) (gpointer user_data);
/**
* GChildWatchFunc:
* @pid: the process id of the child process
- * @status: Status information about the child process,
- * see waitpid(2) for more information about this field
+ * @status: Status information about the child process, encoded
+ * in a platform-specific manner
* @user_data: user data passed to g_child_watch_add()
*
- * The type of functions to be called when a child exists.
+ * Prototype of a #GChildWatchSource callback, called when a child
+ * process has exited. To interpret @status, see the documentation
+ * for g_spawn_check_exit_status().
*/
typedef void (*GChildWatchFunc) (GPid pid,
gint status,
@@ -154,7 +174,7 @@ struct _GSource
gpointer callback_data;
GSourceCallbackFuncs *callback_funcs;
- GSourceFuncs *source_funcs;
+ const GSourceFuncs *source_funcs;
guint ref_count;
GMainContext *context;
@@ -282,130 +302,209 @@ struct _GSourceFuncs
/* GMainContext: */
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_context_new (void);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_context_ref (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_unref (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_context_default (void);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_iteration (GMainContext *context,
gboolean may_block);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_pending (GMainContext *context);
/* For implementation of legacy interfaces
*/
+GLIB_AVAILABLE_IN_ALL
GSource *g_main_context_find_source_by_id (GMainContext *context,
guint source_id);
+GLIB_AVAILABLE_IN_ALL
GSource *g_main_context_find_source_by_user_data (GMainContext *context,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
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.
*/
+GLIB_AVAILABLE_IN_ALL
void g_main_context_wakeup (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_acquire (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_release (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_is_owner (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_wait (GMainContext *context,
GCond *cond,
GMutex *mutex);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_context_prepare (GMainContext *context,
gint *priority);
+GLIB_AVAILABLE_IN_ALL
gint g_main_context_query (GMainContext *context,
gint max_priority,
gint *timeout_,
GPollFD *fds,
gint n_fds);
+GLIB_AVAILABLE_IN_ALL
gint g_main_context_check (GMainContext *context,
gint max_priority,
GPollFD *fds,
gint n_fds);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_dispatch (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_set_poll_func (GMainContext *context,
GPollFunc func);
+GLIB_AVAILABLE_IN_ALL
GPollFunc g_main_context_get_poll_func (GMainContext *context);
/* Low level functions for use by source implementations
*/
+GLIB_AVAILABLE_IN_ALL
void g_main_context_add_poll (GMainContext *context,
GPollFD *fd,
gint priority);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_remove_poll (GMainContext *context,
GPollFD *fd);
+GLIB_AVAILABLE_IN_ALL
gint g_main_depth (void);
+GLIB_AVAILABLE_IN_ALL
GSource *g_main_current_source (void);
/* GMainContexts for other threads
*/
+GLIB_AVAILABLE_IN_ALL
void g_main_context_push_thread_default (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_pop_thread_default (GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_context_get_thread_default (void);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_context_ref_thread_default (void);
/* GMainLoop: */
+GLIB_AVAILABLE_IN_ALL
GMainLoop *g_main_loop_new (GMainContext *context,
gboolean is_running);
+GLIB_AVAILABLE_IN_ALL
void g_main_loop_run (GMainLoop *loop);
+GLIB_AVAILABLE_IN_ALL
void g_main_loop_quit (GMainLoop *loop);
+GLIB_AVAILABLE_IN_ALL
GMainLoop *g_main_loop_ref (GMainLoop *loop);
+GLIB_AVAILABLE_IN_ALL
void g_main_loop_unref (GMainLoop *loop);
+GLIB_AVAILABLE_IN_ALL
gboolean g_main_loop_is_running (GMainLoop *loop);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_main_loop_get_context (GMainLoop *loop);
/* GSource: */
+GLIB_AVAILABLE_IN_ALL
GSource *g_source_new (GSourceFuncs *source_funcs,
guint struct_size);
+GLIB_AVAILABLE_IN_ALL
GSource *g_source_ref (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_unref (GSource *source);
+GLIB_AVAILABLE_IN_ALL
guint g_source_attach (GSource *source,
GMainContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_source_destroy (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_priority (GSource *source,
gint priority);
+GLIB_AVAILABLE_IN_ALL
gint g_source_get_priority (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_can_recurse (GSource *source,
gboolean can_recurse);
+GLIB_AVAILABLE_IN_ALL
gboolean g_source_get_can_recurse (GSource *source);
+GLIB_AVAILABLE_IN_ALL
guint g_source_get_id (GSource *source);
+GLIB_AVAILABLE_IN_ALL
GMainContext *g_source_get_context (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_callback (GSource *source,
GSourceFunc func,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_funcs (GSource *source,
GSourceFuncs *funcs);
+GLIB_AVAILABLE_IN_ALL
gboolean g_source_is_destroyed (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_name (GSource *source,
const char *name);
+GLIB_AVAILABLE_IN_ALL
const char * g_source_get_name (GSource *source);
+GLIB_AVAILABLE_IN_ALL
void g_source_set_name_by_id (guint tag,
const char *name);
+GLIB_AVAILABLE_IN_2_36
+void g_source_set_ready_time (GSource *source,
+ gint64 ready_time);
+GLIB_AVAILABLE_IN_2_36
+gint64 g_source_get_ready_time (GSource *source);
+
+#ifdef G_OS_UNIX
+GLIB_AVAILABLE_IN_2_36
+gpointer g_source_add_unix_fd (GSource *source,
+ gint fd,
+ GIOCondition events);
+GLIB_AVAILABLE_IN_2_36
+void g_source_modify_unix_fd (GSource *source,
+ gpointer tag,
+ GIOCondition new_events);
+GLIB_AVAILABLE_IN_2_36
+void g_source_remove_unix_fd (GSource *source,
+ gpointer tag);
+GLIB_AVAILABLE_IN_2_36
+GIOCondition g_source_query_unix_fd (GSource *source,
+ gpointer tag);
+#endif
/* Used to implement g_source_connect_closure and internally*/
+GLIB_AVAILABLE_IN_ALL
void g_source_set_callback_indirect (GSource *source,
gpointer callback_data,
GSourceCallbackFuncs *callback_funcs);
+GLIB_AVAILABLE_IN_ALL
void g_source_add_poll (GSource *source,
GPollFD *fd);
+GLIB_AVAILABLE_IN_ALL
void g_source_remove_poll (GSource *source,
GPollFD *fd);
+GLIB_AVAILABLE_IN_ALL
void g_source_add_child_source (GSource *source,
GSource *child_source);
+GLIB_AVAILABLE_IN_ALL
void g_source_remove_child_source (GSource *source,
GSource *child_source);
@@ -413,6 +512,7 @@ GLIB_DEPRECATED_IN_2_28_FOR(g_source_get_time)
void g_source_get_current_time (GSource *source,
GTimeVal *timeval);
+GLIB_AVAILABLE_IN_ALL
gint64 g_source_get_time (GSource *source);
/* void g_source_connect_closure (GSource *source,
@@ -421,62 +521,83 @@ gint64 g_source_get_time (GSource *source);
/* Specific source types
*/
+GLIB_AVAILABLE_IN_ALL
GSource *g_idle_source_new (void);
+GLIB_AVAILABLE_IN_ALL
GSource *g_child_watch_source_new (GPid pid);
+GLIB_AVAILABLE_IN_ALL
GSource *g_timeout_source_new (guint interval);
+GLIB_AVAILABLE_IN_ALL
GSource *g_timeout_source_new_seconds (guint interval);
/* Miscellaneous functions
*/
+GLIB_AVAILABLE_IN_ALL
void g_get_current_time (GTimeVal *result);
+GLIB_AVAILABLE_IN_ALL
gint64 g_get_monotonic_time (void);
+GLIB_AVAILABLE_IN_ALL
gint64 g_get_real_time (void);
/* Source manipulation by ID */
+GLIB_AVAILABLE_IN_ALL
gboolean g_source_remove (guint tag);
+GLIB_AVAILABLE_IN_ALL
gboolean g_source_remove_by_user_data (gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
gpointer user_data);
/* Idles, child watchers and timeouts */
+GLIB_AVAILABLE_IN_ALL
guint g_timeout_add_full (gint priority,
guint interval,
GSourceFunc function,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
guint g_timeout_add (guint interval,
GSourceFunc function,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
guint g_timeout_add_seconds_full (gint priority,
guint interval,
GSourceFunc function,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
guint g_timeout_add_seconds (guint interval,
GSourceFunc function,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
guint g_child_watch_add_full (gint priority,
GPid pid,
GChildWatchFunc function,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
guint g_child_watch_add (GPid pid,
GChildWatchFunc function,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
guint g_idle_add (GSourceFunc function,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
guint g_idle_add_full (gint priority,
GSourceFunc function,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
gboolean g_idle_remove_by_data (gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_invoke_full (GMainContext *context,
gint priority,
GSourceFunc function,
gpointer data,
GDestroyNotify notify);
+GLIB_AVAILABLE_IN_ALL
void g_main_context_invoke (GMainContext *context,
GSourceFunc function,
gpointer data);
@@ -485,6 +606,10 @@ void g_main_context_invoke (GMainContext *context,
GLIB_VAR GSourceFuncs g_timeout_funcs;
GLIB_VAR GSourceFuncs g_child_watch_funcs;
GLIB_VAR GSourceFuncs g_idle_funcs;
+#ifdef G_OS_UNIX
+GLIB_VAR GSourceFuncs g_unix_signal_funcs;
+GLIB_VAR GSourceFuncs g_unix_fd_source_funcs;
+#endif
G_END_DECLS
diff --git a/glib/glib/gmappedfile.c b/glib/glib/gmappedfile.c
index b541870..7d241e7 100644
--- a/glib/glib/gmappedfile.c
+++ b/glib/glib/gmappedfile.c
@@ -38,7 +38,9 @@
#include <windows.h>
#include <io.h>
+#undef fstat
#define fstat(a,b) _fstati64(a,b)
+#undef stat
#define stat _stati64
#ifndef S_ISREG
@@ -400,3 +402,27 @@ g_mapped_file_unref (GMappedFile *file)
if (g_atomic_int_dec_and_test (&file->ref_count))
g_mapped_file_destroy (file);
}
+
+/**
+ * g_mapped_file_get_bytes:
+ * @file: a #GMappedFile
+ *
+ * Creates a new #GBytes which references the data mapped from @file.
+ * The mapped contents of the file must not be modified after creating this
+ * bytes object, because a #GBytes should be immutable.
+ *
+ * Returns: (transfer full): A newly allocated #GBytes referencing data
+ * from @file
+ *
+ * Since: 2.34
+ **/
+GBytes *
+g_mapped_file_get_bytes (GMappedFile *file)
+{
+ g_return_val_if_fail (file != NULL, NULL);
+
+ return g_bytes_new_with_free_func (file->contents,
+ file->length,
+ (GDestroyNotify) g_mapped_file_unref,
+ g_mapped_file_ref (file));
+}
diff --git a/glib/glib/gmappedfile.h b/glib/glib/gmappedfile.h
index 52ba31d..a1c7ac7 100644
--- a/glib/glib/gmappedfile.h
+++ b/glib/glib/gmappedfile.h
@@ -19,13 +19,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_MAPPED_FILE_H__
+#define __G_MAPPED_FILE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MAPPED_FILE_H__
-#define __G_MAPPED_FILE_H__
-
#include <glib/gbytes.h>
#include <glib/gerror.h>
@@ -33,15 +33,23 @@ G_BEGIN_DECLS
typedef struct _GMappedFile GMappedFile;
+GLIB_AVAILABLE_IN_ALL
GMappedFile *g_mapped_file_new (const gchar *filename,
gboolean writable,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
GMappedFile *g_mapped_file_new_from_fd (gint fd,
gboolean writable,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gsize g_mapped_file_get_length (GMappedFile *file);
+GLIB_AVAILABLE_IN_ALL
gchar *g_mapped_file_get_contents (GMappedFile *file);
+GLIB_AVAILABLE_IN_2_34
+GBytes * g_mapped_file_get_bytes (GMappedFile *file);
+GLIB_AVAILABLE_IN_ALL
GMappedFile *g_mapped_file_ref (GMappedFile *file);
+GLIB_AVAILABLE_IN_ALL
void g_mapped_file_unref (GMappedFile *file);
GLIB_DEPRECATED_FOR(g_mapped_file_unref)
diff --git a/glib/glib/gmarkup.c b/glib/glib/gmarkup.c
index b0c28a9..fb02a42 100644
--- a/glib/glib/gmarkup.c
+++ b/glib/glib/gmarkup.c
@@ -29,12 +29,14 @@
#include "gmarkup.h"
+#include "gatomic.h"
#include "gslice.h"
#include "galloca.h"
#include "gstrfuncs.h"
#include "gstring.h"
#include "gtestutils.h"
#include "glibintl.h"
+#include "gthread.h"
/**
* SECTION:markup
@@ -82,11 +84,7 @@
* </itemizedlist>
*/
-GQuark
-g_markup_error_quark (void)
-{
- return g_quark_from_static_string ("g-markup-error-quark");
-}
+G_DEFINE_QUARK (g-markup-error-quark, g_markup_error)
typedef enum
{
@@ -120,6 +118,8 @@ struct _GMarkupParseContext
{
const GMarkupParser *parser;
+ volatile gint ref_count;
+
GMarkupParseFlags flags;
gint line_number;
@@ -227,6 +227,7 @@ g_markup_parse_context_new (const GMarkupParser *parser,
context = g_new (GMarkupParseContext, 1);
+ context->ref_count = 1;
context->parser = parser;
context->flags = flags;
context->user_data = user_data;
@@ -269,6 +270,46 @@ g_markup_parse_context_new (const GMarkupParser *parser,
return context;
}
+/**
+ * g_markup_parse_context_ref:
+ * @context: a #GMarkupParseContext
+ *
+ * Increases the reference count of @context.
+ *
+ * Returns: the same @context
+ *
+ * Since: 2.36
+ **/
+GMarkupParseContext *
+g_markup_parse_context_ref (GMarkupParseContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+ g_return_val_if_fail (context->ref_count > 0, NULL);
+
+ g_atomic_int_inc (&context->ref_count);
+
+ return context;
+}
+
+/**
+ * g_markup_parse_context_unref:
+ * @context: a #GMarkupParseContext
+ *
+ * Decreases the reference count of @context. When its reference count
+ * drops to 0, it is freed.
+ *
+ * Since: 2.36
+ **/
+void
+g_markup_parse_context_unref (GMarkupParseContext *context)
+{
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (context->ref_count > 0);
+
+ if (g_atomic_int_dec_and_test (&context->ref_count))
+ g_markup_parse_context_free (context);
+}
+
static void
string_full_free (gpointer ptr)
{
@@ -362,6 +403,7 @@ set_error_literal (GMarkupParseContext *context,
g_propagate_error (error, tmp_error);
}
+G_GNUC_PRINTF(4, 5)
static void
set_error (GMarkupParseContext *context,
GError **error,
@@ -427,7 +469,7 @@ slow_name_validate (GMarkupParseContext *context,
g_unichar_isalpha (g_utf8_get_char (p))))))
{
set_error (context, error, G_MARKUP_ERROR_PARSE,
- _("'%s' is not a valid name "), name);
+ _("'%s' is not a valid name"), name);
return FALSE;
}
@@ -443,7 +485,7 @@ slow_name_validate (GMarkupParseContext *context,
g_unichar_isalpha (g_utf8_get_char (p))))))
{
set_error (context, error, G_MARKUP_ERROR_PARSE,
- _("'%s' is not a valid name: '%c' "), name, *p);
+ _("'%s' is not a valid name: '%c'"), name, *p);
return FALSE;
}
}
@@ -523,6 +565,7 @@ utf8_str (const gchar *utf8,
return buf;
}
+G_GNUC_PRINTF(5, 6)
static void
set_unescape_error (GMarkupParseContext *context,
GError **error,
@@ -641,7 +684,7 @@ unescape_gstring_inplace (GMarkupParseContext *context,
"inside a character reference "
"(&#234; for example) - perhaps "
"the digit is too large"),
- end - from, from);
+ (int)(end - from), from);
return FALSE;
}
else if (*end != ';')
@@ -676,7 +719,7 @@ unescape_gstring_inplace (GMarkupParseContext *context,
from, G_MARKUP_ERROR_PARSE,
_("Character reference '%-.*s' does not "
"encode a permitted character"),
- end - from, from);
+ (int)(end - from), from);
return FALSE;
}
}
@@ -721,7 +764,7 @@ unescape_gstring_inplace (GMarkupParseContext *context,
set_unescape_error (context, error,
from, G_MARKUP_ERROR_PARSE,
_("Entity name '%-.*s' is not known"),
- end-from, from);
+ (int)(end - from), from);
else
set_unescape_error (context, error,
from, G_MARKUP_ERROR_PARSE,
@@ -2323,6 +2366,9 @@ find_conversion (const char *format,
*
* Since: 2.4
*/
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
gchar *
g_markup_vprintf_escaped (const gchar *format,
va_list args)
@@ -2341,7 +2387,7 @@ g_markup_vprintf_escaped (const gchar *format,
* 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,
+ * the original format string, and what from the arguments,
* and thus know what portions of the string to escape.
*
* For instance, for:
@@ -2387,6 +2433,7 @@ g_markup_vprintf_escaped (const gchar *format,
G_VA_COPY (args2, args);
output1 = g_strdup_vprintf (format1->str, args);
+
if (!output1)
{
va_end (args2);
@@ -2397,7 +2444,6 @@ g_markup_vprintf_escaped (const gchar *format,
va_end (args2);
if (!output2)
goto cleanup;
-
result = g_string_new (NULL);
/* Iterate through the original format string again,
@@ -2449,6 +2495,8 @@ g_markup_vprintf_escaped (const gchar *format,
return NULL;
}
+#pragma GCC diagnostic pop
+
/**
* g_markup_printf_escaped:
* @format: printf() style format string
diff --git a/glib/glib/gmarkup.h b/glib/glib/gmarkup.h
index a8865da..eb7214d 100644
--- a/glib/glib/gmarkup.h
+++ b/glib/glib/gmarkup.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_MARKUP_H__
+#define __G_MARKUP_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MARKUP_H__
-#define __G_MARKUP_H__
-
#include <stdarg.h>
#include <glib/gerror.h>
@@ -71,6 +71,7 @@ typedef enum
*/
#define G_MARKUP_ERROR g_markup_error_quark ()
+GLIB_AVAILABLE_IN_ALL
GQuark g_markup_error_quark (void);
/**
@@ -178,39 +179,56 @@ struct _GMarkupParser
gpointer user_data);
};
+GLIB_AVAILABLE_IN_ALL
GMarkupParseContext *g_markup_parse_context_new (const GMarkupParser *parser,
GMarkupParseFlags flags,
gpointer user_data,
GDestroyNotify user_data_dnotify);
+GLIB_AVAILABLE_IN_2_36
+GMarkupParseContext *g_markup_parse_context_ref (GMarkupParseContext *context);
+GLIB_AVAILABLE_IN_2_36
+void g_markup_parse_context_unref (GMarkupParseContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_markup_parse_context_free (GMarkupParseContext *context);
+GLIB_AVAILABLE_IN_ALL
gboolean g_markup_parse_context_parse (GMarkupParseContext *context,
const gchar *text,
gssize text_len,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_markup_parse_context_push (GMarkupParseContext *context,
const GMarkupParser *parser,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gpointer g_markup_parse_context_pop (GMarkupParseContext *context);
+GLIB_AVAILABLE_IN_ALL
gboolean g_markup_parse_context_end_parse (GMarkupParseContext *context,
GError **error);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_markup_parse_context_get_element (GMarkupParseContext *context);
+GLIB_AVAILABLE_IN_ALL
const GSList * g_markup_parse_context_get_element_stack (GMarkupParseContext *context);
/* For user-constructed error messages, has no precise semantics */
+GLIB_AVAILABLE_IN_ALL
void g_markup_parse_context_get_position (GMarkupParseContext *context,
gint *line_number,
gint *char_number);
+GLIB_AVAILABLE_IN_ALL
gpointer g_markup_parse_context_get_user_data (GMarkupParseContext *context);
/* useful when saving */
+GLIB_AVAILABLE_IN_ALL
gchar* g_markup_escape_text (const gchar *text,
gssize length);
+GLIB_AVAILABLE_IN_ALL
gchar *g_markup_printf_escaped (const char *format,
...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
gchar *g_markup_vprintf_escaped (const char *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(1, 0);
typedef enum
{
@@ -225,6 +243,7 @@ typedef enum
/* useful from start_element */
+GLIB_AVAILABLE_IN_ALL
gboolean g_markup_collect_attributes (const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
diff --git a/glib/glib/gmem.c b/glib/glib/gmem.c
index 1f01cd1..e3e2db5 100644
--- a/glib/glib/gmem.c
+++ b/glib/glib/gmem.c
@@ -50,72 +50,17 @@
/* 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.ac and gmem.h in sync here.
- * g_mem_gc_friendly is TRUE, freed memory should be 0-wiped.
+ * If g_mem_gc_friendly is TRUE, freed memory should be 0-wiped.
*/
-/* --- 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,
+ malloc,
+ realloc,
+ free,
+ calloc,
+ malloc,
+ realloc,
};
/**
@@ -254,6 +199,45 @@ g_free (gpointer mem)
}
/**
+ * g_clear_pointer: (skip)
+ * @pp: a pointer to a variable, struct member etc. holding a pointer
+ * @destroy: a function to which a gpointer can be passed, to destroy *@pp
+ *
+ * Clears a reference to a variable.
+ *
+ * @pp must not be %NULL.
+ *
+ * If the reference is %NULL then this function does nothing.
+ * Otherwise, the variable is destroyed using @destroy and the
+ * pointer is set to %NULL.
+ *
+ * This function is threadsafe and modifies the pointer atomically,
+ * using memory barriers where needed.
+ *
+ * A macro is also included that allows this function to be used without
+ * pointer casts.
+ *
+ * Since: 2.34
+ **/
+#undef g_clear_pointer
+void
+g_clear_pointer (gpointer *pp,
+ GDestroyNotify destroy)
+{
+ gpointer _p;
+
+ /* This is a little frustrating.
+ * Would be nice to have an atomic exchange (with no compare).
+ */
+ do
+ _p = g_atomic_pointer_get (pp);
+ while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (pp, _p, NULL));
+
+ if (_p)
+ destroy (_p);
+}
+
+/**
* g_try_malloc:
* @n_bytes: number of bytes to allocate.
*
@@ -590,8 +574,8 @@ profiler_log (ProfilerJob job,
g_mutex_lock (&gmem_profile_mutex);
if (!profile_data)
{
- profile_data = standard_calloc ((MEM_PROFILE_TABLE_SIZE + 1) * 8,
- sizeof (profile_data[0]));
+ profile_data = 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);
@@ -675,7 +659,7 @@ profile_print_locked (guint *local_data,
void
g_mem_profile (void)
{
- guint local_data[(MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0])];
+ guint local_data[(MEM_PROFILE_TABLE_SIZE + 1) * 8];
gsize local_allocs;
gsize local_zinit;
gsize local_frees;
@@ -723,7 +707,7 @@ profiler_try_malloc (gsize n_bytes)
G_BREAKPOINT ();
#endif /* G_ENABLE_DEBUG */
- p = standard_malloc (sizeof (gsize) * 2 + n_bytes);
+ p = malloc (sizeof (gsize) * 2 + n_bytes);
if (p)
{
@@ -761,7 +745,7 @@ profiler_calloc (gsize n_blocks,
G_BREAKPOINT ();
#endif /* G_ENABLE_DEBUG */
- p = standard_calloc (1, sizeof (gsize) * 2 + l);
+ p = calloc (1, sizeof (gsize) * 2 + l);
if (p)
{
@@ -805,7 +789,7 @@ profiler_free (gpointer mem)
TRUE);
memset (p + 2, 0xaa, p[1]);
- /* for all those that miss standard_free (p); in this place, yes,
+ /* for all those that miss 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.
*/
@@ -837,7 +821,7 @@ profiler_try_realloc (gpointer mem,
}
else
{
- p = standard_realloc (mem ? p : NULL, sizeof (gsize) * 2 + n_bytes);
+ p = realloc (mem ? p : NULL, sizeof (gsize) * 2 + n_bytes);
if (p)
{
diff --git a/glib/glib/gmem.h b/glib/glib/gmem.h
index 376e466..8795b67 100644
--- a/glib/glib/gmem.h
+++ b/glib/glib/gmem.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_MEM_H__
+#define __G_MEM_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MEM_H__
-#define __G_MEM_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -67,32 +67,66 @@ typedef struct _GMemVTable GMemVTable;
/* Memory allocation functions
*/
+GLIB_AVAILABLE_IN_ALL
void g_free (gpointer mem);
+GLIB_AVAILABLE_IN_2_34
+void g_clear_pointer (gpointer *pp,
+ GDestroyNotify destroy);
+
+GLIB_AVAILABLE_IN_ALL
gpointer g_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_realloc (gpointer mem,
gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_realloc (gpointer mem,
gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gpointer g_malloc_n (gsize n_blocks,
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
+GLIB_AVAILABLE_IN_ALL
gpointer g_malloc0_n (gsize n_blocks,
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
+GLIB_AVAILABLE_IN_ALL
gpointer g_realloc_n (gpointer mem,
gsize n_blocks,
gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_malloc_n (gsize n_blocks,
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_malloc0_n (gsize n_blocks,
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
+GLIB_AVAILABLE_IN_ALL
gpointer g_try_realloc_n (gpointer mem,
gsize n_blocks,
gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
+#define g_clear_pointer(pp, destroy) \
+ G_STMT_START { \
+ G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \
+ /* Only one access, please */ \
+ gpointer *_pp = (gpointer *) (pp); \
+ gpointer _p; \
+ /* This assignment is needed to avoid a gcc warning */ \
+ GDestroyNotify _destroy = (GDestroyNotify) (destroy); \
+ \
+ (void) (0 ? (gpointer) *(pp) : 0); \
+ do \
+ _p = g_atomic_pointer_get (_pp); \
+ while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (_pp, _p, NULL)); \
+ \
+ if (_p) \
+ _destroy (_p); \
+ } G_STMT_END
/* Optimise: avoid the call to the (slower) _n function if we can
* determine at compile-time that no overflow happens.
@@ -249,7 +283,9 @@ struct _GMemVTable {
gpointer (*try_realloc) (gpointer mem,
gsize n_bytes);
};
+GLIB_AVAILABLE_IN_ALL
void g_mem_set_vtable (GMemVTable *vtable);
+GLIB_AVAILABLE_IN_ALL
gboolean g_mem_is_system_malloc (void);
GLIB_VAR gboolean g_mem_gc_friendly;
@@ -257,6 +293,7 @@ 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;
+GLIB_AVAILABLE_IN_ALL
void g_mem_profile (void);
G_END_DECLS
diff --git a/glib/glib/gmessages-private.h b/glib/glib/gmessages-private.h
new file mode 100644
index 0000000..1a592b9
--- /dev/null
+++ b/glib/glib/gmessages-private.h
@@ -0,0 +1,35 @@
+/* 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_MESSAGES_PRIVATE_H__
+#define __G_MESSAGES_PRIVATE_H__
+
+#include <glib/gmessages.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL void
+_g_log_set_exit_on_fatal (void);
+
+G_GNUC_INTERNAL void
+_g_log_abort (void) G_GNUC_NORETURN;
+
+G_END_DECLS
+
+#endif /* __G_MESSAGES_PRIVATE_H__ */
diff --git a/glib/glib/gmessages.c b/glib/glib/gmessages.c
index f32d51c..928276f 100644
--- a/glib/glib/gmessages.c
+++ b/glib/glib/gmessages.c
@@ -59,7 +59,7 @@
#include <locale.h>
#include <errno.h>
-#include "gmessages.h"
+#include "gmessages-private.h"
#include "glib-init.h"
#include "gbacktrace.h"
@@ -72,6 +72,7 @@
#include "gthread.h"
#include "gstrfuncs.h"
#include "gstring.h"
+#include "gpattern.h"
#ifdef G_OS_WIN32
#include <process.h> /* For getpid() */
@@ -237,12 +238,23 @@ static GLogDomain *g_log_domains = NULL;
static GPrintFunc glib_print_func = NULL;
static GPrintFunc glib_printerr_func = NULL;
static GPrivate g_log_depth;
+static gboolean exit_on_fatal;
static GLogFunc default_log_func = g_log_default_handler;
static gpointer default_log_data = NULL;
static GTestLogFatalFunc fatal_log_func = NULL;
static gpointer fatal_log_data;
/* --- functions --- */
+
+void
+_g_log_abort (void)
+{
+ if (exit_on_fatal)
+ _exit (1);
+ else
+ abort ();
+}
+
#ifdef G_OS_WIN32
# include <windows.h>
static gboolean win32_keep_fatal_message = FALSE;
@@ -280,7 +292,10 @@ static void
write_string (int fd,
const gchar *string)
{
- write (fd, string, strlen (string));
+ int res;
+ do
+ res = write (fd, string, strlen (string));
+ while (G_UNLIKELY (res == -1 && errno == EINTR));
}
static GLogDomain*
@@ -637,214 +652,10 @@ g_log_remove_handler (const gchar *log_domain,
}
}
g_mutex_unlock (&g_messages_lock);
- g_warning ("%s: could not find handler with id `%d' for domain \"%s\"",
+ g_warning ("%s: could not find handler with id '%d' for domain \"%s\"",
G_STRLOC, handler_id, log_domain);
}
-/**
- * g_logv:
- * @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
- *
- * Logs an error or debugging message.
- *
- * If the log level has been set as fatal, the abort()
- * function is called to terminate the program.
- */
-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)
- {
- GLogDomain *domain;
- GLogFunc log_func;
- GLogLevelFlags domain_fatal_mask;
- gpointer data = NULL;
- gboolean masquerade_fatal = FALSE;
- guint depth;
-
- 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);
- depth = GPOINTER_TO_UINT (g_private_get (&g_log_depth));
- 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));
-
-
- 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];
- gsize size G_GNUC_UNUSED;
- va_list args2;
-
- G_VA_COPY (args2, args1);
- size = _g_vsnprintf (buffer, 1024, format, args2);
- va_end (args2);
-
- log_func (log_domain, test_level, buffer, data);
- }
- else
- {
- gchar *msg;
- va_list args2;
-
- G_VA_COPY (args2, args1);
- msg = g_strdup_vprintf (format, args2);
- va_end (args2);
-
- log_func (log_domain, test_level, msg, data);
-
- if ((test_level & G_LOG_FLAG_FATAL)
- && !(test_level & G_LOG_LEVEL_ERROR))
- {
- masquerade_fatal = fatal_log_func
- && !fatal_log_func (log_domain, test_level, msg, fatal_log_data);
- }
-
- g_free (msg);
- }
-
- if ((test_level & G_LOG_FLAG_FATAL) && !masquerade_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 (!(test_level & G_LOG_FLAG_RECURSION))
- G_BREAKPOINT ();
- else
- abort ();
-#endif /* !G_OS_WIN32 */
- }
-
- depth--;
- g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
- }
- }
-}
-
-/**
- * g_log:
- * @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
- * @...: the parameters to insert into the format string
- *
- * Logs an error or debugging message.
- *
- * If the log level has been set as fatal, the abort()
- * function is called to terminate the program.
- */
-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)
-{
- g_log (log_domain,
- G_LOG_LEVEL_CRITICAL,
- "%s: assertion `%s' failed",
- pretty_function,
- expression);
-}
-
-void
-g_warn_message (const char *domain,
- const char *file,
- int line,
- const char *func,
- const char *warnexpr)
-{
- char *s, lstr[32];
- g_snprintf (lstr, 32, "%d", line);
- if (warnexpr)
- s = g_strconcat ("(", file, ":", lstr, "):",
- func, func[0] ? ":" : "",
- " runtime check failed: (", warnexpr, ")", NULL);
- else
- s = g_strconcat ("(", file, ":", lstr, "):",
- func, func[0] ? ":" : "",
- " ", "code should not be reached", NULL);
- g_log (domain, G_LOG_LEVEL_WARNING, "%s", s);
- g_free (s);
-}
-
-void
-g_assert_warning (const char *log_domain,
- const char *file,
- const int line,
- const char *pretty_function,
- const char *expression)
-{
- 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)))
@@ -1023,11 +834,337 @@ mklevel_prefix (gchar level_prefix[STRING_BUFFER_SIZE],
strcat (level_prefix, " **");
#ifdef G_OS_WIN32
- win32_keep_fatal_message = (log_level & G_LOG_FLAG_FATAL) != 0;
+ if ((log_level & G_LOG_FLAG_FATAL) != 0 && !g_test_initialized ())
+ win32_keep_fatal_message = TRUE;
#endif
return to_stdout ? 1 : 2;
}
+typedef struct {
+ gchar *log_domain;
+ GLogLevelFlags log_level;
+ gchar *pattern;
+} GTestExpectedMessage;
+
+static GSList *expected_messages = NULL;
+
+/**
+ * g_logv:
+ * @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
+ *
+ * Logs an error or debugging message.
+ *
+ * If the log level has been set as fatal, the abort()
+ * function is called to terminate the program.
+ */
+void
+g_logv (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *format,
+ va_list args)
+{
+ gboolean was_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
+ gboolean was_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0;
+ gchar buffer[1025], *msg, *msg_alloc = NULL;
+ gint i;
+
+ log_level &= G_LOG_LEVEL_MASK;
+ if (!log_level)
+ return;
+
+ if (log_level & G_LOG_FLAG_RECURSION)
+ {
+ /* we use a stack buffer of fixed size, since we're likely
+ * in an out-of-memory situation
+ */
+ gsize size G_GNUC_UNUSED;
+
+ size = _g_vsnprintf (buffer, 1024, format, args);
+ msg = buffer;
+ }
+ else
+ msg = msg_alloc = g_strdup_vprintf (format, args);
+
+ if (expected_messages)
+ {
+ GTestExpectedMessage *expected = expected_messages->data;
+
+ expected_messages = g_slist_delete_link (expected_messages,
+ expected_messages);
+ if (g_strcmp0 (expected->log_domain, log_domain) == 0 &&
+ ((log_level & expected->log_level) == expected->log_level) &&
+ g_pattern_match_simple (expected->pattern, msg))
+ {
+ g_free (expected->log_domain);
+ g_free (expected->pattern);
+ g_free (expected);
+ g_free (msg_alloc);
+ return;
+ }
+ else
+ {
+ gchar level_prefix[STRING_BUFFER_SIZE];
+ gchar *expected_message;
+
+ mklevel_prefix (level_prefix, expected->log_level);
+ expected_message = g_strdup_printf ("Did not see expected message %s: %s",
+ level_prefix, expected->pattern);
+ g_log_default_handler (log_domain, log_level, expected_message, NULL);
+ g_free (expected_message);
+
+ log_level |= G_LOG_FLAG_FATAL;
+ }
+ }
+
+ 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)
+ {
+ GLogDomain *domain;
+ GLogFunc log_func;
+ GLogLevelFlags domain_fatal_mask;
+ gpointer data = NULL;
+ gboolean masquerade_fatal = FALSE;
+ guint depth;
+
+ 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);
+ depth = GPOINTER_TO_UINT (g_private_get (&g_log_depth));
+ 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));
+
+ log_func (log_domain, test_level, msg, data);
+
+ if ((test_level & G_LOG_FLAG_FATAL)
+ && !(test_level & G_LOG_LEVEL_ERROR))
+ {
+ masquerade_fatal = fatal_log_func
+ && !fatal_log_func (log_domain, test_level, msg, fatal_log_data);
+ }
+
+ if ((test_level & G_LOG_FLAG_FATAL) && exit_on_fatal && !masquerade_fatal)
+ {
+ _g_log_abort ();
+ }
+ else if ((test_level & G_LOG_FLAG_FATAL) && !masquerade_fatal)
+ {
+#ifdef G_OS_WIN32
+ if (win32_keep_fatal_message)
+ {
+ 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 (!(test_level & G_LOG_FLAG_RECURSION))
+ G_BREAKPOINT ();
+ else
+ abort ();
+#endif /* !G_OS_WIN32 */
+ }
+
+ depth--;
+ g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
+ }
+ }
+
+ g_free (msg_alloc);
+}
+
+/**
+ * g_log:
+ * @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
+ * @...: the parameters to insert into the format string
+ *
+ * Logs an error or debugging message.
+ *
+ * If the log level has been set as fatal, the abort()
+ * function is called to terminate the program.
+ */
+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)
+{
+ g_log (log_domain,
+ G_LOG_LEVEL_CRITICAL,
+ "%s: assertion '%s' failed",
+ pretty_function,
+ expression);
+}
+
+void
+g_warn_message (const char *domain,
+ const char *file,
+ int line,
+ const char *func,
+ const char *warnexpr)
+{
+ char *s, lstr[32];
+ g_snprintf (lstr, 32, "%d", line);
+ if (warnexpr)
+ s = g_strconcat ("(", file, ":", lstr, "):",
+ func, func[0] ? ":" : "",
+ " runtime check failed: (", warnexpr, ")", NULL);
+ else
+ s = g_strconcat ("(", file, ":", lstr, "):",
+ func, func[0] ? ":" : "",
+ " ", "code should not be reached", NULL);
+ g_log (domain, G_LOG_LEVEL_WARNING, "%s", s);
+ g_free (s);
+}
+
+void
+g_assert_warning (const char *log_domain,
+ const char *file,
+ const int line,
+ const char *pretty_function,
+ const char *expression)
+{
+ 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);
+ _g_log_abort ();
+}
+
+/**
+ * g_test_expect_message:
+ * @log_domain: (allow-none): the log domain of the message
+ * @log_level: the log level of the message
+ * @pattern: a glob-style
+ * <link linkend="glib-Glob-style-pattern-matching">pattern</link>
+ *
+ * Indicates that a message with the given @log_domain and @log_level,
+ * with text matching @pattern, is expected to be logged. When this
+ * message is logged, it will not be printed, and the test case will
+ * not abort.
+ *
+ * Use g_test_assert_expected_messages() to assert that all
+ * previously-expected messages have been seen and suppressed.
+ *
+ * You can call this multiple times in a row, if multiple messages are
+ * expected as a result of a single call. (The messages must appear in
+ * the same order as the calls to g_test_expect_message().)
+ *
+ * For example:
+ *
+ * |[
+ * /&ast; g_main_context_push_thread_default() should fail if the
+ * &ast; context is already owned by another thread.
+ * &ast;/
+ * g_test_expect_message (G_LOG_DOMAIN,
+ * G_LOG_LEVEL_CRITICAL,
+ * "assertion*acquired_context*failed");
+ * g_main_context_push_thread_default (bad_context);
+ * g_test_assert_expected_messages ();
+ * ]|
+ *
+ * Note that you cannot use this to test g_error() messages, since
+ * g_error() intentionally never returns even if the program doesn't
+ * abort; use g_test_trap_subprocess() in this case.
+ *
+ * Since: 2.34
+ */
+void
+g_test_expect_message (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *pattern)
+{
+ GTestExpectedMessage *expected;
+
+ g_return_if_fail (log_level != 0);
+ g_return_if_fail (pattern != NULL);
+
+ expected = g_new (GTestExpectedMessage, 1);
+ expected->log_domain = g_strdup (log_domain);
+ expected->log_level = log_level;
+ expected->pattern = g_strdup (pattern);
+
+ expected_messages = g_slist_append (expected_messages, expected);
+}
+
+void
+g_test_assert_expected_messages_internal (const char *domain,
+ const char *file,
+ int line,
+ const char *func)
+{
+ if (expected_messages)
+ {
+ GTestExpectedMessage *expected;
+ gchar level_prefix[STRING_BUFFER_SIZE];
+ gchar *message;
+
+ expected = expected_messages->data;
+
+ mklevel_prefix (level_prefix, expected->log_level);
+ message = g_strdup_printf ("Did not see expected message %s: %s",
+ level_prefix, expected->pattern);
+ g_assertion_message (domain, file, line, func, message);
+ g_free (message);
+ }
+}
+
+/**
+ * g_test_assert_expected_messages:
+ *
+ * Asserts that all messages previously indicated via
+ * g_test_expect_message() have been seen and suppressed.
+ *
+ * Since: 2.34
+ */
+
void
_g_log_fallback_handler (const gchar *log_domain,
GLogLevelFlags log_level,
@@ -1429,3 +1566,9 @@ g_printf_string_upper_bound (const gchar *format,
gchar c;
return _g_vsnprintf (&c, 1, format, args) + 1;
}
+
+void
+_g_log_set_exit_on_fatal (void)
+{
+ exit_on_fatal = TRUE;
+}
diff --git a/glib/glib/gmessages.h b/glib/glib/gmessages.h
index 9cbcc83..77958ad 100644
--- a/glib/glib/gmessages.h
+++ b/glib/glib/gmessages.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_MESSAGES_H__
+#define __G_MESSAGES_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_MESSAGES_H__
-#define __G_MESSAGES_H__
-
#include <stdarg.h>
#include <glib/gtypes.h>
#include <glib/gmacros.h>
@@ -45,8 +45,9 @@ G_BEGIN_DECLS
/* calculate a string size, guaranteed to fit format + args.
*/
+GLIB_AVAILABLE_IN_ALL
gsize g_printf_string_upper_bound (const gchar* format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(1, 0);
/* Log level shift offset for user defined
* log levels (0-7 are used by GLib).
@@ -82,45 +83,55 @@ typedef void (*GLogFunc) (const gchar *log_domain,
/* Logging mechanism
*/
+GLIB_AVAILABLE_IN_ALL
guint g_log_set_handler (const gchar *log_domain,
GLogLevelFlags log_levels,
GLogFunc log_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_log_remove_handler (const gchar *log_domain,
guint handler_id);
+GLIB_AVAILABLE_IN_ALL
void g_log_default_handler (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer unused_data);
+GLIB_AVAILABLE_IN_ALL
GLogFunc g_log_set_default_handler (GLogFunc log_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_log (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *format,
...) G_GNUC_PRINTF (3, 4);
+GLIB_AVAILABLE_IN_ALL
void g_logv (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(3, 0);
+GLIB_AVAILABLE_IN_ALL
GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain,
GLogLevelFlags fatal_mask);
+GLIB_AVAILABLE_IN_ALL
GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask);
/* internal */
-G_GNUC_INTERNAL void _g_log_fallback_handler (const gchar *log_domain,
+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 */
+GLIB_AVAILABLE_IN_ALL
void g_return_if_fail_warning (const char *log_domain,
const char *pretty_function,
- const char *expression);
+ const char *expression) G_ANALYZER_NORETURN;
+GLIB_AVAILABLE_IN_ALL
void g_warn_message (const char *domain,
const char *file,
int line,
const char *func,
- const char *warnexpr);
+ const char *warnexpr) G_ANALYZER_NORETURN;
GLIB_DEPRECATED
void g_assert_warning (const char *log_domain,
const char *file,
@@ -132,7 +143,8 @@ void g_assert_warning (const char *log_domain,
#ifndef G_LOG_DOMAIN
#define G_LOG_DOMAIN ((gchar*) 0)
#endif /* G_LOG_DOMAIN */
-#ifdef G_HAVE_ISO_VARARGS
+
+#if defined(G_HAVE_ISO_VARARGS) && !G_ANALYZER_ANALYZING
/* for(;;) ; so that GCC knows that control doesn't go past g_error().
* Put space before ending semicolon to avoid C++ build warnings.
*/
@@ -155,7 +167,7 @@ void g_assert_warning (const char *log_domain,
#define g_debug(...) g_log (G_LOG_DOMAIN, \
G_LOG_LEVEL_DEBUG, \
__VA_ARGS__)
-#elif defined(G_HAVE_GNUC_VARARGS)
+#elif defined(G_HAVE_GNUC_VARARGS) && !G_ANALYZER_ANALYZING
#define g_error(format...) G_STMT_START { \
g_log (G_LOG_DOMAIN, \
G_LOG_LEVEL_ERROR, \
@@ -176,6 +188,9 @@ void g_assert_warning (const char *log_domain,
G_LOG_LEVEL_DEBUG, \
format)
#else /* no varargs macros */
+static void g_error (const gchar *format, ...) G_ANALYZER_NORETURN;
+static void g_critical (const gchar *format, ...) G_ANALYZER_NORETURN;
+
static void
g_error (const gchar *format,
...)
@@ -233,11 +248,15 @@ g_debug (const gchar *format,
* These are called with the complete formatted string to output.
*/
typedef void (*GPrintFunc) (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
void g_print (const gchar *format,
...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
GPrintFunc g_set_print_handler (GPrintFunc func);
+GLIB_AVAILABLE_IN_ALL
void g_printerr (const gchar *format,
...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
GPrintFunc g_set_printerr_handler (GPrintFunc func);
/**
@@ -360,7 +379,7 @@ GPrintFunc g_set_printerr_handler (GPrintFunc func);
{ \
g_log (G_LOG_DOMAIN, \
G_LOG_LEVEL_CRITICAL, \
- "file %s: line %d: assertion `%s' failed", \
+ "file %s: line %d: assertion '%s' failed", \
__FILE__, \
__LINE__, \
#expr); \
@@ -372,7 +391,7 @@ GPrintFunc g_set_printerr_handler (GPrintFunc func);
{ \
g_log (G_LOG_DOMAIN, \
G_LOG_LEVEL_CRITICAL, \
- "file %s: line %d: assertion `%s' failed", \
+ "file %s: line %d: assertion '%s' failed", \
__FILE__, \
__LINE__, \
#expr); \
diff --git a/glib/glib/gnode.c b/glib/glib/gnode.c
index b2c3226..80cc44b 100644
--- a/glib/glib/gnode.c
+++ b/glib/glib/gnode.c
@@ -840,12 +840,13 @@ g_node_depth_traverse_level (GNode *node,
* GNodeTraverseFunc:
* @node: a #GNode.
* @data: user data passed to g_node_traverse().
- * @Returns: %TRUE to stop the traversal.
*
* 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.
+ *
+ * Returns: %TRUE to stop the traversal.
**/
void
g_node_traverse (GNode *root,
diff --git a/glib/glib/gnode.h b/glib/glib/gnode.h
index 7ffdcbf..71f60ab 100644
--- a/glib/glib/gnode.h
+++ b/glib/glib/gnode.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_NODE_H__
+#define __G_NODE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_NODE_H__
-#define __G_NODE_H__
-
#include <glib/gmem.h>
G_BEGIN_DECLS
@@ -112,30 +112,44 @@ struct _GNode
*/
#define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_new (gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_node_destroy (GNode *root);
+GLIB_AVAILABLE_IN_ALL
void g_node_unlink (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_copy_deep (GNode *node,
GCopyFunc copy_func,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_copy (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_insert (GNode *parent,
gint position,
GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_insert_before (GNode *parent,
GNode *sibling,
GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_insert_after (GNode *parent,
GNode *sibling,
GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_prepend (GNode *parent,
GNode *node);
+GLIB_AVAILABLE_IN_ALL
guint g_node_n_nodes (GNode *root,
GTraverseFlags flags);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_get_root (GNode *node);
+GLIB_AVAILABLE_IN_ALL
gboolean g_node_is_ancestor (GNode *node,
GNode *descendant);
+GLIB_AVAILABLE_IN_ALL
guint g_node_depth (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_find (GNode *root,
GTraverseType order,
GTraverseFlags flags,
@@ -218,11 +232,12 @@ GNode* g_node_find (GNode *root,
#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).
+/* 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.
*/
+GLIB_AVAILABLE_IN_ALL
void g_node_traverse (GNode *root,
GTraverseType order,
GTraverseFlags flags,
@@ -230,31 +245,42 @@ void g_node_traverse (GNode *root,
GNodeTraverseFunc func,
gpointer data);
-/* return the maximum tree height starting with `node', this is an expensive
+/* 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
+ * adding 'guint height' to struct _GNode, but then again, this is not very
* often needed, and would make g_node_insert() more time consuming.
*/
+GLIB_AVAILABLE_IN_ALL
guint g_node_max_height (GNode *root);
+GLIB_AVAILABLE_IN_ALL
void g_node_children_foreach (GNode *node,
GTraverseFlags flags,
GNodeForeachFunc func,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_node_reverse_children (GNode *node);
+GLIB_AVAILABLE_IN_ALL
guint g_node_n_children (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_nth_child (GNode *node,
guint n);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_last_child (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_find_child (GNode *node,
GTraverseFlags flags,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
gint g_node_child_position (GNode *node,
GNode *child);
+GLIB_AVAILABLE_IN_ALL
gint g_node_child_index (GNode *node,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_first_sibling (GNode *node);
+GLIB_AVAILABLE_IN_ALL
GNode* g_node_last_sibling (GNode *node);
/**
diff --git a/glib/glib/gnulib/Makefile.am b/glib/glib/gnulib/Makefile.am
index a8666ff..06ce41c 100644
--- a/glib/glib/gnulib/Makefile.am
+++ b/glib/glib/gnulib/Makefile.am
@@ -1,11 +1,16 @@
## Process this file with automake to produce Makefile.in
-include $(top_srcdir)/Makefile.decl
+include $(top_srcdir)/glib.mk
-INCLUDES = $(glib_INCLUDES) -DG_LOG_DOMAIN=\"GLib\" \
- $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION
+AM_CPPFLAGS = \
+ $(glib_INCLUDES) \
+ -DG_LOG_DOMAIN=\"GLib\" \
+ $(GLIB_DEBUG_FLAGS) \
+ -DG_DISABLE_DEPRECATED \
+ -DGLIB_COMPILATION
-noinst_LTLIBRARIES = libgnulib.la
+noinst_LTLIBRARIES += libgnulib.la
+libgnulib_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS)
libgnulib_la_SOURCES = \
asnprintf.c \
printf-args.c \
diff --git a/glib/glib/gnulib/vasnprintf.c b/glib/glib/gnulib/vasnprintf.c
index c981059..5ecc419 100644
--- a/glib/glib/gnulib/vasnprintf.c
+++ b/glib/glib/gnulib/vasnprintf.c
@@ -729,13 +729,16 @@ vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
{
size_t maxlen;
int count;
+#if HAVE_SNPRINTF
int retcount;
+#endif
maxlen = allocated - length;
count = -1;
- retcount = 0;
#if HAVE_SNPRINTF
+ retcount = 0;
+
#define SNPRINTF_BUF(arg) \
switch (prefix_count) \
{ \
diff --git a/glib/glib/goption.c b/glib/glib/goption.c
index 9f54be0..0a22f6f 100644
--- a/glib/glib/goption.c
+++ b/glib/glib/goption.c
@@ -261,7 +261,6 @@ static glong
_g_utf8_strwidth (const gchar *p)
{
glong len = 0;
- const gchar *start = p;
g_return_val_if_fail (p != NULL, 0);
while (*p)
@@ -273,16 +272,11 @@ _g_utf8_strwidth (const gchar *p)
return len;
}
-
-GQuark
-g_option_error_quark (void)
-{
- return g_quark_from_static_string ("g-option-context-error-quark");
-}
+G_DEFINE_QUARK (g-option-context-error-quark, g_option_error)
/**
* g_option_context_new:
- * @parameter_string: a string which is displayed in
+ * @parameter_string: (allow-none): a string which is displayed in
* the first line of <option>--help</option> output, after the
* usage summary
* <literal><replaceable>programname</replaceable> [OPTION...]</literal>
@@ -563,10 +557,12 @@ g_option_context_add_main_entries (GOptionContext *context,
}
static gint
-calculate_max_length (GOptionGroup *group)
+calculate_max_length (GOptionGroup *group,
+ GHashTable *aliases)
{
GOptionEntry *entry;
gint i, len, max_length;
+ const gchar *long_name;
max_length = 0;
@@ -577,7 +573,10 @@ calculate_max_length (GOptionGroup *group)
if (entry->flags & G_OPTION_FLAG_HIDDEN)
continue;
- len = _g_utf8_strwidth (entry->long_name);
+ long_name = g_hash_table_lookup (aliases, &entry->long_name);
+ if (!long_name)
+ long_name = entry->long_name;
+ len = _g_utf8_strwidth (long_name);
if (entry->short_name)
len += 4;
@@ -595,9 +594,11 @@ static void
print_entry (GOptionGroup *group,
gint max_length,
const GOptionEntry *entry,
- GString *string)
+ GString *string,
+ GHashTable *aliases)
{
GString *str;
+ const gchar *long_name;
if (entry->flags & G_OPTION_FLAG_HIDDEN)
return;
@@ -605,12 +606,16 @@ print_entry (GOptionGroup *group,
if (entry->long_name[0] == 0)
return;
+ long_name = g_hash_table_lookup (aliases, &entry->long_name);
+ if (!long_name)
+ long_name = entry->long_name;
+
str = g_string_new (NULL);
if (entry->short_name)
- g_string_append_printf (str, " -%c, --%s", entry->short_name, entry->long_name);
+ g_string_append_printf (str, " -%c, --%s", entry->short_name, long_name);
else
- g_string_append_printf (str, " --%s", entry->long_name);
+ g_string_append_printf (str, " --%s", long_name);
if (entry->arg_description)
g_string_append_printf (str, "=%s", TRANSLATE (group, entry->arg_description));
@@ -640,6 +645,8 @@ group_has_visible_entries (GOptionContext *context,
if (main_entries && !main_group && !(entry->flags & G_OPTION_FLAG_IN_MAIN))
continue;
+ if (entry->long_name[0] == 0) /* ignore rest entry */
+ continue;
if (!(entry->flags & reject_filter))
return TRUE;
}
@@ -716,10 +723,11 @@ g_option_context_get_help (GOptionContext *context,
GOptionGroup *group)
{
GList *list;
- gint max_length, len;
+ gint max_length = 0, len;
gint i;
GOptionEntry *entry;
GHashTable *shadow_map;
+ GHashTable *aliases;
gboolean seen[256];
const gchar *rest_description;
GString *string;
@@ -767,6 +775,7 @@ g_option_context_get_help (GOptionContext *context,
memset (seen, 0, sizeof (gboolean) * 256);
shadow_map = g_hash_table_new (g_str_hash, g_str_equal);
+ aliases = g_hash_table_new_full (NULL, NULL, NULL, g_free);
if (context->main_group)
{
@@ -793,7 +802,10 @@ g_option_context_get_help (GOptionContext *context,
entry = &g->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", g->name, entry->long_name);
+ {
+ g_hash_table_insert (aliases, &entry->long_name,
+ g_strdup_printf ("%s-%s", g->name, entry->long_name));
+ }
else
g_hash_table_insert (shadow_map, (gpointer)entry->long_name, entry);
@@ -810,17 +822,20 @@ g_option_context_get_help (GOptionContext *context,
list = context->groups;
- max_length = _g_utf8_strwidth ("-?, --help");
-
- if (list)
+ if (context->help_enabled)
{
- len = _g_utf8_strwidth ("--help-all");
- max_length = MAX (max_length, len);
+ max_length = _g_utf8_strwidth ("-?, --help");
+
+ if (list)
+ {
+ len = _g_utf8_strwidth ("--help-all");
+ max_length = MAX (max_length, len);
+ }
}
if (context->main_group)
{
- len = calculate_max_length (context->main_group);
+ len = calculate_max_length (context->main_group, aliases);
max_length = MAX (max_length, len);
}
@@ -828,12 +843,15 @@ g_option_context_get_help (GOptionContext *context,
{
GOptionGroup *g = list->data;
- /* First, we check the --help-<groupname> options */
- len = _g_utf8_strwidth ("--help-") + _g_utf8_strwidth (g->name);
- max_length = MAX (max_length, len);
+ if (context->help_enabled)
+ {
+ /* First, we check the --help-<groupname> options */
+ len = _g_utf8_strwidth ("--help-") + _g_utf8_strwidth (g->name);
+ max_length = MAX (max_length, len);
+ }
/* Then we go through the entries */
- len = calculate_max_length (g);
+ len = calculate_max_length (g, aliases);
max_length = MAX (max_length, len);
list = list->next;
@@ -842,7 +860,7 @@ g_option_context_get_help (GOptionContext *context,
/* Add a bit of padding */
max_length += 4;
- if (!group)
+ if (!group && context->help_enabled)
{
list = context->groups;
@@ -882,7 +900,7 @@ g_option_context_get_help (GOptionContext *context,
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);
+ print_entry (group, max_length, &group->entries[i], string, aliases);
g_string_append (string, "\n");
}
}
@@ -902,7 +920,7 @@ g_option_context_get_help (GOptionContext *context,
g_string_append (string, "\n");
for (i = 0; i < g->n_entries; i++)
if (!(g->entries[i].flags & G_OPTION_FLAG_IN_MAIN))
- print_entry (g, max_length, &g->entries[i], string);
+ print_entry (g, max_length, &g->entries[i], string, aliases);
g_string_append (string, "\n");
}
@@ -923,7 +941,7 @@ g_option_context_get_help (GOptionContext *context,
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);
+ &context->main_group->entries[i], string, aliases);
while (list != NULL)
{
@@ -932,7 +950,7 @@ g_option_context_get_help (GOptionContext *context,
/* Print main entries from other groups */
for (i = 0; i < g->n_entries; i++)
if (g->entries[i].flags & G_OPTION_FLAG_IN_MAIN)
- print_entry (g, max_length, &g->entries[i], string);
+ print_entry (g, max_length, &g->entries[i], string, aliases);
list = list->next;
}
@@ -946,6 +964,8 @@ g_option_context_get_help (GOptionContext *context,
g_string_append (string, "\n");
}
+ g_hash_table_destroy (aliases);
+
return g_string_free (string, FALSE);
}
diff --git a/glib/glib/goption.h b/glib/glib/goption.h
index 7d1f2a1..ee01377 100644
--- a/glib/glib/goption.h
+++ b/glib/glib/goption.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_OPTION_H__
+#define __G_OPTION_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_OPTION_H__
-#define __G_OPTION_H__
-
#include <glib/gerror.h>
#include <glib/gquark.h>
@@ -209,6 +209,7 @@ typedef enum
G_OPTION_ERROR_FAILED
} GOptionError;
+GLIB_AVAILABLE_IN_ALL
GQuark g_option_error_quark (void);
/**
@@ -307,61 +308,86 @@ struct _GOptionEntry
*/
#define G_OPTION_REMAINING ""
+GLIB_AVAILABLE_IN_ALL
GOptionContext *g_option_context_new (const gchar *parameter_string);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_summary (GOptionContext *context,
const gchar *summary);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_option_context_get_summary (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_description (GOptionContext *context,
const gchar *description);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_option_context_get_description (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_free (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_help_enabled (GOptionContext *context,
gboolean help_enabled);
+GLIB_AVAILABLE_IN_ALL
gboolean g_option_context_get_help_enabled (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_ignore_unknown_options (GOptionContext *context,
gboolean ignore_unknown);
+GLIB_AVAILABLE_IN_ALL
gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_add_main_entries (GOptionContext *context,
const GOptionEntry *entries,
const gchar *translation_domain);
+GLIB_AVAILABLE_IN_ALL
gboolean g_option_context_parse (GOptionContext *context,
gint *argc,
gchar ***argv,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_translate_func (GOptionContext *context,
GTranslateFunc func,
gpointer data,
GDestroyNotify destroy_notify);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_translation_domain (GOptionContext *context,
const gchar *domain);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_add_group (GOptionContext *context,
GOptionGroup *group);
+GLIB_AVAILABLE_IN_ALL
void g_option_context_set_main_group (GOptionContext *context,
GOptionGroup *group);
+GLIB_AVAILABLE_IN_ALL
GOptionGroup *g_option_context_get_main_group (GOptionContext *context);
+GLIB_AVAILABLE_IN_ALL
gchar *g_option_context_get_help (GOptionContext *context,
gboolean main_help,
GOptionGroup *group);
+GLIB_AVAILABLE_IN_ALL
GOptionGroup *g_option_group_new (const gchar *name,
const gchar *description,
const gchar *help_description,
gpointer user_data,
GDestroyNotify destroy);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_set_parse_hooks (GOptionGroup *group,
GOptionParseFunc pre_parse_func,
GOptionParseFunc post_parse_func);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_set_error_hook (GOptionGroup *group,
GOptionErrorFunc error_func);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_free (GOptionGroup *group);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_add_entries (GOptionGroup *group,
const GOptionEntry *entries);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_set_translate_func (GOptionGroup *group,
GTranslateFunc func,
gpointer data,
GDestroyNotify destroy_notify);
+GLIB_AVAILABLE_IN_ALL
void g_option_group_set_translation_domain (GOptionGroup *group,
const gchar *domain);
diff --git a/glib/glib/gpattern.c b/glib/glib/gpattern.c
index bc0cc71..c638086 100644
--- a/glib/glib/gpattern.c
+++ b/glib/glib/gpattern.c
@@ -168,7 +168,6 @@ g_pattern_ph_match (const gchar *match_pattern,
* <emphasis>not</emphasis> g_utf8_strlen())
* @string: the UTF-8 encoded string to match
* @string_reversed: (allow-none): the reverse of @string or %NULL
- * @Returns: %TRUE if @string matches @pspec
*
* Matches a string against a compiled pattern. Passing the correct
* length of the string given is mandatory. The reversed string can be
@@ -188,6 +187,8 @@ g_pattern_ph_match (const gchar *match_pattern,
* only if the string doesn't contain any multibyte characters. GLib
* offers the g_utf8_strreverse() function to reverse UTF-8 encoded
* strings.
+ *
+ * Returns: %TRUE if @string matches @pspec
**/
gboolean
g_pattern_match (GPatternSpec *pspec,
@@ -245,9 +246,10 @@ g_pattern_match (GPatternSpec *pspec,
/**
* g_pattern_spec_new:
* @pattern: a zero-terminated UTF-8 encoded string
- * @Returns: a newly-allocated #GPatternSpec
*
* Compiles a pattern to a #GPatternSpec.
+ *
+ * Returns: a newly-allocated #GPatternSpec
**/
GPatternSpec*
g_pattern_spec_new (const gchar *pattern)
@@ -376,10 +378,11 @@ g_pattern_spec_free (GPatternSpec *pspec)
* g_pattern_spec_equal:
* @pspec1: a #GPatternSpec
* @pspec2: another #GPatternSpec
- * @Returns: Whether the compiled patterns are equal
*
* Compares two compiled pattern specs and returns whether they will
* match the same set of strings.
+ *
+ * Returns: Whether the compiled patterns are equal
**/
gboolean
g_pattern_spec_equal (GPatternSpec *pspec1,
@@ -397,11 +400,12 @@ g_pattern_spec_equal (GPatternSpec *pspec1,
* g_pattern_match_string:
* @pspec: a #GPatternSpec
* @string: the UTF-8 encoded string to match
- * @Returns: %TRUE if @string matches @pspec
*
* 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.
+ *
+ * Returns: %TRUE if @string matches @pspec
**/
gboolean
g_pattern_match_string (GPatternSpec *pspec,
@@ -417,12 +421,13 @@ g_pattern_match_string (GPatternSpec *pspec,
* g_pattern_match_simple:
* @pattern: the UTF-8 encoded pattern
* @string: the UTF-8 encoded string to match
- * @Returns: %TRUE if @string matches @pspec
*
* 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() repeatedly.
+ *
+ * Returns: %TRUE if @string matches @pspec
**/
gboolean
g_pattern_match_simple (const gchar *pattern,
diff --git a/glib/glib/gpattern.h b/glib/glib/gpattern.h
index e692d90..956b003 100644
--- a/glib/glib/gpattern.h
+++ b/glib/glib/gpattern.h
@@ -17,13 +17,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_PATTERN_H__
+#define __G_PATTERN_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_PATTERN_H__
-#define __G_PATTERN_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -31,16 +31,22 @@ G_BEGIN_DECLS
typedef struct _GPatternSpec GPatternSpec;
+GLIB_AVAILABLE_IN_ALL
GPatternSpec* g_pattern_spec_new (const gchar *pattern);
+GLIB_AVAILABLE_IN_ALL
void g_pattern_spec_free (GPatternSpec *pspec);
+GLIB_AVAILABLE_IN_ALL
gboolean g_pattern_spec_equal (GPatternSpec *pspec1,
GPatternSpec *pspec2);
+GLIB_AVAILABLE_IN_ALL
gboolean g_pattern_match (GPatternSpec *pspec,
guint string_length,
const gchar *string,
const gchar *string_reversed);
+GLIB_AVAILABLE_IN_ALL
gboolean g_pattern_match_string (GPatternSpec *pspec,
const gchar *string);
+GLIB_AVAILABLE_IN_ALL
gboolean g_pattern_match_simple (const gchar *pattern,
const gchar *string);
diff --git a/glib/glib/gpoll.h b/glib/glib/gpoll.h
index f28b758..3ba8420 100644
--- a/glib/glib/gpoll.h
+++ b/glib/glib/gpoll.h
@@ -17,13 +17,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_POLL_H__
+#define __G_POLL_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (__G_MAIN_H__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_POLL_H__
-#define __G_POLL_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -111,6 +111,7 @@ struct _GPollFD
#define G_POLLFD_FORMAT "%d"
#endif
+GLIB_AVAILABLE_IN_ALL
gint g_poll (GPollFD *fds,
guint nfds,
gint timeout);
diff --git a/glib/glib/gprimes.h b/glib/glib/gprimes.h
index 19f5702..536ace4 100644
--- a/glib/glib/gprimes.h
+++ b/glib/glib/gprimes.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_PRIMES_H__
+#define __G_PRIMES_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_PRIMES_H__
-#define __G_PRIMES_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -44,6 +44,7 @@ G_BEGIN_DECLS
* next largest prime, or the highest it knows about which is about
* MAXINT/4.
*/
+GLIB_AVAILABLE_IN_ALL
guint g_spaced_primes_closest (guint num) G_GNUC_CONST;
G_END_DECLS
diff --git a/glib/glib/gprintf.h b/glib/glib/gprintf.h
index d96870f..0b01cc4 100644
--- a/glib/glib/gprintf.h
+++ b/glib/glib/gprintf.h
@@ -26,26 +26,33 @@
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
gint g_printf (gchar const *format,
...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
gint g_fprintf (FILE *file,
gchar const *format,
...) G_GNUC_PRINTF (2, 3);
+GLIB_AVAILABLE_IN_ALL
gint g_sprintf (gchar *string,
gchar const *format,
...) G_GNUC_PRINTF (2, 3);
+GLIB_AVAILABLE_IN_ALL
gint g_vprintf (gchar const *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(1, 0);
+GLIB_AVAILABLE_IN_ALL
gint g_vfprintf (FILE *file,
gchar const *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(2, 0);
+GLIB_AVAILABLE_IN_ALL
gint g_vsprintf (gchar *string,
gchar const *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(2, 0);
+GLIB_AVAILABLE_IN_ALL
gint g_vasprintf (gchar **string,
gchar const *format,
- va_list args);
+ va_list args) G_GNUC_PRINTF(2, 0);
G_END_DECLS
diff --git a/glib/glib/gqsort.h b/glib/glib/gqsort.h
index 05b4b66..c67d949 100644
--- a/glib/glib/gqsort.h
+++ b/glib/glib/gqsort.h
@@ -24,17 +24,18 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_QSORT_H__
+#define __G_QSORT_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_QSORT_H__
-#define __G_QSORT_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
+GLIB_AVAILABLE_IN_ALL
void g_qsort_with_data (gconstpointer pbase,
gint total_elems,
gsize size,
diff --git a/glib/glib/gquark.c b/glib/glib/gquark.c
new file mode 100644
index 0000000..9762dd6
--- /dev/null
+++ b/glib/glib/gquark.c
@@ -0,0 +1,361 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ * Copyright (C) 1998 Tim Janik
+ *
+ * gquark.c: Functions for dealing with quarks and interned strings
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "gslice.h"
+#include "ghash.h"
+#include "gquark.h"
+#include "gstrfuncs.h"
+#include "gthread.h"
+#include "gtestutils.h"
+#include "glib_trace.h"
+
+#define QUARK_BLOCK_SIZE 2048
+#define QUARK_STRING_BLOCK_SIZE (4096 - sizeof (gsize))
+
+static inline GQuark quark_new (gchar *string);
+
+G_LOCK_DEFINE_STATIC (quark_global);
+static GHashTable *quark_ht = NULL;
+static gchar **quarks = NULL;
+static gint quark_seq_id = 0;
+static gchar *quark_block = NULL;
+static gint quark_block_offset = 0;
+
+/**
+ * SECTION:quarks
+ * @title: Quarks
+ * @short_description: a 2-way association between a string and a
+ * unique integer identifier
+ *
+ * Quarks are associations between strings and integer identifiers.
+ * Given either the string or the #GQuark identifier it is possible to
+ * retrieve the other.
+ *
+ * Quarks are used for both <link
+ * linkend="glib-Datasets">Datasets</link> and <link
+ * linkend="glib-Keyed-Data-Lists">Keyed Data Lists</link>.
+ *
+ * To create a new quark from a string, use g_quark_from_string() or
+ * g_quark_from_static_string().
+ *
+ * To find the string corresponding to a given #GQuark, use
+ * g_quark_to_string().
+ *
+ * To find the #GQuark corresponding to a given string, use
+ * g_quark_try_string().
+ *
+ * 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 comparison, rather than using strcmp().
+ **/
+
+/**
+ * GQuark:
+ *
+ * A GQuark is a non-zero integer which uniquely identifies a
+ * particular string. A GQuark value of zero is associated to %NULL.
+ **/
+
+/**
+ * G_DEFINE_QUARK:
+ * @QN: the name to return a #GQuark for
+ * @q_n: prefix for the function name
+ *
+ * A convenience macro which defines a function returning the
+ * #GQuark for the name @QN. The function will be named
+ * @q_n<!-- -->_quark().
+ * Note that the quark name will be stringified automatically in the
+ * macro, so you shouldn't use double quotes.
+ *
+ * Since: 2.34
+ */
+
+/**
+ * g_quark_try_string:
+ * @string: (allow-none): a string.
+ * @Returns: the #GQuark associated with the string, or 0 if @string is
+ * %NULL or there is no #GQuark associated with it.
+ *
+ * Gets the #GQuark associated with the given string, or 0 if string is
+ * %NULL or it has no associated #GQuark.
+ *
+ * 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().
+ **/
+GQuark
+g_quark_try_string (const gchar *string)
+{
+ GQuark quark = 0;
+
+ if (string == NULL)
+ return 0;
+
+ G_LOCK (quark_global);
+ if (quark_ht)
+ quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
+ G_UNLOCK (quark_global);
+
+ return quark;
+}
+
+/* HOLDS: quark_global_lock */
+static char *
+quark_strdup (const gchar *string)
+{
+ gchar *copy;
+ gsize len;
+
+ len = strlen (string) + 1;
+
+ /* For strings longer than half the block size, fall back
+ to strdup so that we fill our blocks at least 50%. */
+ if (len > QUARK_STRING_BLOCK_SIZE / 2)
+ return g_strdup (string);
+
+ if (quark_block == NULL ||
+ QUARK_STRING_BLOCK_SIZE - quark_block_offset < len)
+ {
+ quark_block = g_malloc (QUARK_STRING_BLOCK_SIZE);
+ quark_block_offset = 0;
+ }
+
+ copy = quark_block + quark_block_offset;
+ memcpy (copy, string, len);
+ quark_block_offset += len;
+
+ return copy;
+}
+
+/* HOLDS: quark_global_lock */
+static inline GQuark
+quark_from_string (const gchar *string,
+ gboolean duplicate)
+{
+ GQuark quark = 0;
+
+ if (quark_ht)
+ quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
+
+ if (!quark)
+ {
+ quark = quark_new (duplicate ? quark_strdup (string) : (gchar *)string);
+ TRACE(GLIB_QUARK_NEW(string, quark));
+ }
+
+ return quark;
+}
+
+/**
+ * g_quark_from_string:
+ * @string: (allow-none): a string.
+ *
+ * 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.
+ *
+ * Returns: the #GQuark identifying the string, or 0 if @string is
+ * %NULL.
+ */
+GQuark
+g_quark_from_string (const gchar *string)
+{
+ GQuark quark;
+
+ if (!string)
+ return 0;
+
+ G_LOCK (quark_global);
+ quark = quark_from_string (string, TRUE);
+ G_UNLOCK (quark_global);
+
+ return quark;
+}
+
+/**
+ * g_quark_from_static_string:
+ * @string: (allow-none): a string.
+ *
+ * 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.
+ *
+ * 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).
+ *
+ * Returns: the #GQuark identifying the string, or 0 if @string is
+ * %NULL.
+ */
+GQuark
+g_quark_from_static_string (const gchar *string)
+{
+ GQuark quark;
+
+ if (!string)
+ return 0;
+
+ G_LOCK (quark_global);
+ quark = quark_from_string (string, FALSE);
+ G_UNLOCK (quark_global);
+
+ return quark;
+}
+
+/**
+ * g_quark_to_string:
+ * @quark: a #GQuark.
+ *
+ * Gets the string associated with the given #GQuark.
+ *
+ * Returns: the string associated with the #GQuark
+ */
+const gchar *
+g_quark_to_string (GQuark quark)
+{
+ gchar* result = NULL;
+ gchar **strings;
+ gint seq_id;
+
+ seq_id = g_atomic_int_get (&quark_seq_id);
+ strings = g_atomic_pointer_get (&quarks);
+
+ if (quark < seq_id)
+ result = strings[quark];
+
+ return result;
+}
+
+/* HOLDS: g_quark_global_lock */
+static inline GQuark
+quark_new (gchar *string)
+{
+ GQuark quark;
+ gchar **quarks_new;
+
+ if (quark_seq_id % QUARK_BLOCK_SIZE == 0)
+ {
+ quarks_new = g_new (gchar*, quark_seq_id + QUARK_BLOCK_SIZE);
+ if (quark_seq_id != 0)
+ memcpy (quarks_new, quarks, sizeof (char *) * quark_seq_id);
+ memset (quarks_new + quark_seq_id, 0, sizeof (char *) * QUARK_BLOCK_SIZE);
+ /* This leaks the old quarks array. Its unfortunate, but it allows
+ * us to do lockless lookup of the arrays, and there shouldn't be that
+ * many quarks in an app
+ */
+ g_atomic_pointer_set (&quarks, quarks_new);
+ }
+ if (!quark_ht)
+ {
+ g_assert (quark_seq_id == 0);
+ quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
+ quarks[quark_seq_id] = NULL;
+ g_atomic_int_inc (&quark_seq_id);
+ }
+
+ quark = quark_seq_id;
+ g_atomic_pointer_set (&quarks[quark], string);
+ g_hash_table_insert (quark_ht, string, GUINT_TO_POINTER (quark));
+ g_atomic_int_inc (&quark_seq_id);
+
+ return quark;
+}
+
+/**
+ * g_intern_string:
+ * @string: (allow-none): 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
+ */
+const gchar *
+g_intern_string (const gchar *string)
+{
+ const gchar *result;
+ GQuark quark;
+
+ if (!string)
+ return NULL;
+
+ G_LOCK (quark_global);
+ quark = quark_from_string (string, TRUE);
+ result = quarks[quark];
+ G_UNLOCK (quark_global);
+
+ return result;
+}
+
+/**
+ * g_intern_static_string:
+ * @string: (allow-none): 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
+ */
+const gchar *
+g_intern_static_string (const gchar *string)
+{
+ GQuark quark;
+ const gchar *result;
+
+ if (!string)
+ return NULL;
+
+ G_LOCK (quark_global);
+ quark = quark_from_string (string, FALSE);
+ result = quarks[quark];
+ G_UNLOCK (quark_global);
+
+ return result;
+}
diff --git a/glib/glib/gquark.h b/glib/glib/gquark.h
index 78b9546..617dbd2 100644
--- a/glib/glib/gquark.h
+++ b/glib/glib/gquark.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_QUARK_H__
+#define __G_QUARK_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_QUARK_H__
-#define __G_QUARK_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -39,12 +39,30 @@ typedef guint32 GQuark;
/* Quarks (string<->id association)
*/
+GLIB_AVAILABLE_IN_ALL
GQuark g_quark_try_string (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
GQuark g_quark_from_static_string (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
GQuark g_quark_from_string (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_quark_to_string (GQuark quark) G_GNUC_CONST;
+#define G_DEFINE_QUARK(QN, q_n) \
+GQuark \
+q_n##_quark (void) \
+{ \
+ static GQuark q; \
+ \
+ if G_UNLIKELY (q == 0) \
+ q = g_quark_from_static_string (#QN); \
+ \
+ return q; \
+}
+
+GLIB_AVAILABLE_IN_ALL
const gchar * g_intern_string (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_intern_static_string (const gchar *string);
G_END_DECLS
diff --git a/glib/glib/gqueue.h b/glib/glib/gqueue.h
index 1d13eef..23536a4 100644
--- a/glib/glib/gqueue.h
+++ b/glib/glib/gqueue.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_QUEUE_H__
+#define __G_QUEUE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_QUEUE_H__
-#define __G_QUEUE_H__
-
#include <glib/glist.h>
G_BEGIN_DECLS
@@ -71,79 +71,119 @@ struct _GQueue
/* Queues
*/
+GLIB_AVAILABLE_IN_ALL
GQueue* g_queue_new (void);
+GLIB_AVAILABLE_IN_ALL
void g_queue_free (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_queue_free_full (GQueue *queue,
GDestroyNotify free_func);
+GLIB_AVAILABLE_IN_ALL
void g_queue_init (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_queue_clear (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gboolean g_queue_is_empty (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
guint g_queue_get_length (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_queue_reverse (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GQueue * g_queue_copy (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
void g_queue_foreach (GQueue *queue,
GFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
GList * g_queue_find (GQueue *queue,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
GList * g_queue_find_custom (GQueue *queue,
gconstpointer data,
GCompareFunc func);
+GLIB_AVAILABLE_IN_ALL
void g_queue_sort (GQueue *queue,
GCompareDataFunc compare_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_head (GQueue *queue,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_tail (GQueue *queue,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_nth (GQueue *queue,
gpointer data,
gint n);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_pop_head (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_pop_tail (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_pop_nth (GQueue *queue,
guint n);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_peek_head (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_peek_tail (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
gpointer g_queue_peek_nth (GQueue *queue,
guint n);
+GLIB_AVAILABLE_IN_ALL
gint g_queue_index (GQueue *queue,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
gboolean g_queue_remove (GQueue *queue,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
guint g_queue_remove_all (GQueue *queue,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_insert_before (GQueue *queue,
GList *sibling,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_insert_after (GQueue *queue,
GList *sibling,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_insert_sorted (GQueue *queue,
gpointer data,
GCompareDataFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_head_link (GQueue *queue,
GList *link_);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_tail_link (GQueue *queue,
GList *link_);
+GLIB_AVAILABLE_IN_ALL
void g_queue_push_nth_link (GQueue *queue,
gint n,
GList *link_);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_pop_head_link (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_pop_tail_link (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_pop_nth_link (GQueue *queue,
guint n);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_peek_head_link (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_peek_tail_link (GQueue *queue);
+GLIB_AVAILABLE_IN_ALL
GList* g_queue_peek_nth_link (GQueue *queue,
guint n);
+GLIB_AVAILABLE_IN_ALL
gint g_queue_link_index (GQueue *queue,
GList *link_);
+GLIB_AVAILABLE_IN_ALL
void g_queue_unlink (GQueue *queue,
GList *link_);
+GLIB_AVAILABLE_IN_ALL
void g_queue_delete_link (GQueue *queue,
GList *link_);
diff --git a/glib/glib/grand.c b/glib/glib/grand.c
index 4d6a0a6..1485c2e 100644
--- a/glib/glib/grand.c
+++ b/glib/glib/grand.c
@@ -404,10 +404,11 @@ g_rand_set_seed_array (GRand* rand, const guint32 *seed, guint seed_length)
/**
* g_rand_boolean:
* @rand_: a #GRand.
- * @Returns: a random #gboolean.
*
* Returns a random #gboolean from @rand_. This corresponds to a
* unbiased coin toss.
+ *
+ * Returns: a random #gboolean.
**/
/**
* g_rand_int:
@@ -585,9 +586,10 @@ g_rand_double_range (GRand* rand, gdouble begin, gdouble end)
/**
* g_random_boolean:
- * @Returns: a random #gboolean.
*
* Returns a random #gboolean. This corresponds to a unbiased coin toss.
+ *
+ * Returns: a random #gboolean.
**/
/**
* g_random_int:
diff --git a/glib/glib/grand.h b/glib/glib/grand.h
index 182616b..b121e50 100644
--- a/glib/glib/grand.h
+++ b/glib/glib/grand.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_RAND_H__
+#define __G_RAND_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_RAND_H__
-#define __G_RAND_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -46,36 +46,52 @@ typedef struct _GRand GRand;
* double_range -> [begin..end)
*/
+GLIB_AVAILABLE_IN_ALL
GRand* g_rand_new_with_seed (guint32 seed);
+GLIB_AVAILABLE_IN_ALL
GRand* g_rand_new_with_seed_array (const guint32 *seed,
guint seed_length);
+GLIB_AVAILABLE_IN_ALL
GRand* g_rand_new (void);
+GLIB_AVAILABLE_IN_ALL
void g_rand_free (GRand *rand_);
+GLIB_AVAILABLE_IN_ALL
GRand* g_rand_copy (GRand *rand_);
+GLIB_AVAILABLE_IN_ALL
void g_rand_set_seed (GRand *rand_,
guint32 seed);
+GLIB_AVAILABLE_IN_ALL
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)
+GLIB_AVAILABLE_IN_ALL
guint32 g_rand_int (GRand *rand_);
+GLIB_AVAILABLE_IN_ALL
gint32 g_rand_int_range (GRand *rand_,
gint32 begin,
gint32 end);
+GLIB_AVAILABLE_IN_ALL
gdouble g_rand_double (GRand *rand_);
+GLIB_AVAILABLE_IN_ALL
gdouble g_rand_double_range (GRand *rand_,
gdouble begin,
gdouble end);
+GLIB_AVAILABLE_IN_ALL
void g_random_set_seed (guint32 seed);
#define g_random_boolean() ((g_random_int () & (1 << 15)) != 0)
+GLIB_AVAILABLE_IN_ALL
guint32 g_random_int (void);
+GLIB_AVAILABLE_IN_ALL
gint32 g_random_int_range (gint32 begin,
gint32 end);
+GLIB_AVAILABLE_IN_ALL
gdouble g_random_double (void);
+GLIB_AVAILABLE_IN_ALL
gdouble g_random_double_range (gdouble begin,
gdouble end);
diff --git a/glib/glib/gregex.c b/glib/glib/gregex.c
deleted file mode 100644
index bf82bd1..0000000
--- a/glib/glib/gregex.c
+++ /dev/null
@@ -1,2971 +0,0 @@
-/* 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 <string.h>
-
-#ifdef USE_SYSTEM_PCRE
-#include <pcre.h>
-#else
-#include "pcre/pcre.h"
-#endif
-
-#include "gtypes.h"
-#include "gregex.h"
-#include "glibintl.h"
-#include "glist.h"
-#include "gmessages.h"
-#include "gstrfuncs.h"
-#include "gatomic.h"
-#include "gthread.h"
-
-/**
- * SECTION:gregex
- * @title: Perl-compatible regular expressions
- * @short_description: matches strings against regular expressions
- * @see_also: <xref linkend="glib-regex-syntax"/>
- *
- * The <function>g_regex_*()</function> functions implement regular
- * expression pattern matching using syntax and semantics similar to
- * Perl regular expression.
- *
- * Some functions accept a @start_position 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
- * @start_position 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.
- *
- * 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.
- *
- * 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).
- *
- * 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.
- *
- * 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.
- *
- * The regular expressions low-level functionalities are obtained through
- * the excellent <ulink url="http://www.pcre.org/">PCRE</ulink> library
- * written by Philip Hazel.
- */
-
-/* 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
-{
- volatile gint ref_count; /* the ref count */
- 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 n_offsets; /* number of offsets */
- gint *offsets; /* array of offsets paired 0,1 ; 2,3 ; 3,4 etc */
- 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 gint 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");
- case PCRE_ERROR_BADOFFSET:
- return _("bad offset");
- case PCRE_ERROR_SHORTUTF8:
- return _("short utf8");
- default:
- break;
- }
- return _("unknown error");
-}
-
-static void
-translate_compile_error (gint *errcode, const gchar **errmsg)
-{
- /* Compile errors are created adding 100 to the error code returned
- * by PCRE.
- * If errcode is known we put the translatable error message in
- * erromsg. If errcode is unknown we put the generic
- * G_REGEX_ERROR_COMPILE error code in errcode and keep the
- * untranslated error message returned by PCRE.
- * Note that there can be more PCRE errors with the same GRegexError
- * and that some PCRE errors are useless for us.
- */
- *errcode += 100;
-
- switch (*errcode)
- {
- case G_REGEX_ERROR_STRAY_BACKSLASH:
- *errmsg = _("\\ at end of pattern");
- break;
- case G_REGEX_ERROR_MISSING_CONTROL_CHAR:
- *errmsg = _("\\c at end of pattern");
- break;
- case G_REGEX_ERROR_UNRECOGNIZED_ESCAPE:
- *errmsg = _("unrecognized character follows \\");
- break;
- case 137:
- /* A number of Perl escapes are not handled by PCRE.
- * Therefore it explicitly raises ERR37.
- */
- *errcode = G_REGEX_ERROR_UNRECOGNIZED_ESCAPE;
- *errmsg = _("case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here");
- break;
- case G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER:
- *errmsg = _("numbers out of order in {} quantifier");
- break;
- case G_REGEX_ERROR_QUANTIFIER_TOO_BIG:
- *errmsg = _("number too big in {} quantifier");
- break;
- case G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS:
- *errmsg = _("missing terminating ] for character class");
- break;
- case G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS:
- *errmsg = _("invalid escape sequence in character class");
- break;
- case G_REGEX_ERROR_RANGE_OUT_OF_ORDER:
- *errmsg = _("range out of order in character class");
- break;
- case G_REGEX_ERROR_NOTHING_TO_REPEAT:
- *errmsg = _("nothing to repeat");
- break;
- case G_REGEX_ERROR_UNRECOGNIZED_CHARACTER:
- *errmsg = _("unrecognized character after (?");
- break;
- case 124:
- *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER;
- *errmsg = _("unrecognized character after (?<");
- break;
- case 141:
- *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER;
- *errmsg = _("unrecognized character after (?P");
- break;
- case G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS:
- *errmsg = _("POSIX named classes are supported only within a class");
- break;
- case G_REGEX_ERROR_UNMATCHED_PARENTHESIS:
- *errmsg = _("missing terminating )");
- break;
- case 122:
- *errcode = G_REGEX_ERROR_UNMATCHED_PARENTHESIS;
- *errmsg = _(") without opening (");
- break;
- case 129:
- *errcode = G_REGEX_ERROR_UNMATCHED_PARENTHESIS;
- /* translators: '(?R' and '(?[+-]digits' are both meant as (groups of)
- * sequences here, '(?-54' would be an example for the second group.
- */
- *errmsg = _("(?R or (?[+-]digits must be followed by )");
- break;
- case G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE:
- *errmsg = _("reference to non-existent subpattern");
- break;
- case G_REGEX_ERROR_UNTERMINATED_COMMENT:
- *errmsg = _("missing ) after comment");
- break;
- case G_REGEX_ERROR_EXPRESSION_TOO_LARGE:
- *errmsg = _("regular expression too large");
- break;
- case G_REGEX_ERROR_MEMORY_ERROR:
- *errmsg = _("failed to get memory");
- break;
- case G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND:
- *errmsg = _("lookbehind assertion is not fixed length");
- break;
- case G_REGEX_ERROR_MALFORMED_CONDITION:
- *errmsg = _("malformed number or name after (?(");
- break;
- case G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES:
- *errmsg = _("conditional group contains more than two branches");
- break;
- case G_REGEX_ERROR_ASSERTION_EXPECTED:
- *errmsg = _("assertion expected after (?(");
- break;
- case G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME:
- *errmsg = _("unknown POSIX class name");
- break;
- case G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED:
- *errmsg = _("POSIX collating elements are not supported");
- break;
- case G_REGEX_ERROR_HEX_CODE_TOO_LARGE:
- *errmsg = _("character value in \\x{...} sequence is too large");
- break;
- case G_REGEX_ERROR_INVALID_CONDITION:
- *errmsg = _("invalid condition (?(0)");
- break;
- case G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND:
- *errmsg = _("\\C not allowed in lookbehind assertion");
- break;
- case G_REGEX_ERROR_INFINITE_LOOP:
- *errmsg = _("recursive call could loop indefinitely");
- break;
- case G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR:
- *errmsg = _("missing terminator in subpattern name");
- break;
- case G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME:
- *errmsg = _("two named subpatterns have the same name");
- break;
- case G_REGEX_ERROR_MALFORMED_PROPERTY:
- *errmsg = _("malformed \\P or \\p sequence");
- break;
- case G_REGEX_ERROR_UNKNOWN_PROPERTY:
- *errmsg = _("unknown property name after \\P or \\p");
- break;
- case G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG:
- *errmsg = _("subpattern name is too long (maximum 32 characters)");
- break;
- case G_REGEX_ERROR_TOO_MANY_SUBPATTERNS:
- *errmsg = _("too many named subpatterns (maximum 10,000)");
- break;
- case G_REGEX_ERROR_INVALID_OCTAL_VALUE:
- *errmsg = _("octal value is greater than \\377");
- break;
- case G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE:
- *errmsg = _("DEFINE group contains more than one branch");
- break;
- case G_REGEX_ERROR_DEFINE_REPETION:
- *errmsg = _("repeating a DEFINE group is not allowed");
- break;
- case G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS:
- *errmsg = _("inconsistent NEWLINE options");
- break;
- case G_REGEX_ERROR_MISSING_BACK_REFERENCE:
- *errmsg = _("\\g is not followed by a braced name or an optionally "
- "braced non-zero number");
- break;
- case 11:
- *errcode = G_REGEX_ERROR_INTERNAL;
- *errmsg = _("unexpected repeat");
- break;
- case 23:
- *errcode = G_REGEX_ERROR_INTERNAL;
- *errmsg = _("code overflow");
- break;
- case 52:
- *errcode = G_REGEX_ERROR_INTERNAL;
- *errmsg = _("overran compiling workspace");
- break;
- case 53:
- *errcode = G_REGEX_ERROR_INTERNAL;
- *errmsg = _("previously-checked referenced subpattern not found");
- break;
- case 16:
- /* This should not happen as we never pass a NULL erroffset */
- g_warning ("erroffset passed as NULL");
- *errcode = G_REGEX_ERROR_COMPILE;
- break;
- case 17:
- /* This should not happen as we check options before passing them
- * to pcre_compile2() */
- g_warning ("unknown option bit(s) set");
- *errcode = G_REGEX_ERROR_COMPILE;
- break;
- case 32:
- case 44:
- case 45:
- /* These errors should not happen as we are using an UTF8-enabled PCRE
- * and we do not check if strings are valid */
- g_warning ("%s", *errmsg);
- *errcode = G_REGEX_ERROR_COMPILE;
- break;
- default:
- *errcode = G_REGEX_ERROR_COMPILE;
- }
-}
-
-/* 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->ref_count = 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);
- /* Set an invalid position for the previous match. */
- match_info->offsets[0] = -1;
- match_info->offsets[1] = -1;
-
- 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_ref:
- * @match_info: a #GMatchInfo
- *
- * Increases reference count of @match_info by 1.
- *
- * Returns: @match_info
- *
- * Since: 2.30
- */
-GMatchInfo *
-g_match_info_ref (GMatchInfo *match_info)
-{
- g_return_val_if_fail (match_info != NULL, NULL);
- g_atomic_int_inc (&match_info->ref_count);
- return match_info;
-}
-
-/**
- * g_match_info_unref:
- * @match_info: a #GMatchInfo
- *
- * Decreases reference count of @match_info by 1. When reference count drops
- * to zero, it frees all the memory associated with the match_info structure.
- *
- * Since: 2.30
- */
-void
-g_match_info_unref (GMatchInfo *match_info)
-{
- if (g_atomic_int_dec_and_test (&match_info->ref_count))
- {
- g_regex_unref (match_info->regex);
- g_free (match_info->offsets);
- g_free (match_info->workspace);
- g_free (match_info);
- }
-}
-
-/**
- * g_match_info_free:
- * @match_info: (allow-none): a #GMatchInfo, or %NULL
- *
- * If @match_info is not %NULL, calls g_match_info_unref(); otherwise does
- * nothing.
- *
- * Since: 2.14
- */
-void
-g_match_info_free (GMatchInfo *match_info)
-{
- if (match_info == NULL)
- return;
-
- g_match_info_unref (match_info);
-}
-
-/**
- * g_match_info_next:
- * @match_info: a #GMatchInfo structure
- * @error: location to store the error occurring, 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)
-{
- gint prev_match_start;
- gint prev_match_end;
-
- 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);
-
- prev_match_start = match_info->offsets[0];
- prev_match_end = 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->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];
- }
-
- /* it's possible to get two identical matches when we are matching
- * empty strings, for instance if the pattern is "(?=[A-Z0-9])" and
- * the string is "RegExTest" we have:
- * - search at position 0: match from 0 to 0
- * - search at position 1: match from 3 to 3
- * - search at position 3: match from 3 to 3 (duplicate)
- * - search at position 4: match from 5 to 5
- * - search at position 5: match from 5 to 5 (duplicate)
- * - search at position 6: no match -> stop
- * so we have to ignore the duplicates.
- * see bug #515944: http://bugzilla.gnome.org/show_bug.cgi?id=515944 */
- if (match_info->matches >= 0 &&
- prev_match_start == match_info->offsets[0] &&
- prev_match_end == match_info->offsets[1])
- {
- /* ignore this match and search the next one */
- return g_match_info_next (match_info, error);
- }
-
- return match_info->matches >= 0;
-}
-
-/**
- * g_match_info_matches:
- * @match_info: a #GMatchInfo structure
- *
- * Returns whether the previous match operation succeeded.
- *
- * 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 these functions
- * return %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
- * meta-sequences 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: (allow-none): a #GMatchInfo or %NULL
- * @string_to_expand: the string to expand
- * @error: location to store the error occurring, 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: (allow-none): 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_free_full (list, (GDestroyNotify) free_interpolation_data);
-
- 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: (allow-none): 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: (out) (allow-none): pointer to location where to store
- * the start position, or %NULL
- * @end_pos: (out) (allow-none): pointer to location where to store
- * the end position, or %NULL
- *
- * Retrieves the position in bytes 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;
-
- if (!(match_info->regex->compile_opts & G_REGEX_DUPNAMES))
- return pcre_get_stringnumber (match_info->regex->pcre_re, name);
-
- /* 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: (allow-none): 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: (out) (allow-none): pointer to location where to store
- * the start position, or %NULL
- * @end_pos: (out) (allow-none): pointer to location where to store
- * the end position, or %NULL
- *
- * Retrieves the position in bytes 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: (allow-none): 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, NULL);
-
- 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 (&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_dec_and_test (&regex->ref_count))
- {
- 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, or 0
- * @match_options: match options for the regular expression, or 0
- * @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;
- gint errcode;
- gboolean optimize = FALSE;
- static gsize initialised;
- unsigned long int pcre_compile_options;
-
- 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 (g_once_init_enter (&initialised))
- {
- gint support;
- const gchar *msg;
-
- pcre_config (PCRE_CONFIG_UTF8, &support);
- if (!support)
- {
- msg = N_("PCRE library is compiled without UTF8 support");
- g_critical ("%s", msg);
- g_set_error_literal (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 ("%s", msg);
- g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg));
- return NULL;
- }
-
- g_once_init_leave (&initialised, 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_options |= PCRE_UCP;
-
- /* compile the pattern */
- re = pcre_compile2 (pattern, compile_options, &errcode,
- &errmsg, &erroffset, NULL);
-
- /* if the compilation failed, set the error member and return
- * immediately */
- if (re == NULL)
- {
- GError *tmp_error;
-
- /* Translate the PCRE error code to GRegexError and use a translated
- * error message if possible */
- translate_compile_error (&errcode, &errmsg);
-
- /* PCRE uses byte offsets but we want to show character offsets */
- erroffset = g_utf8_pointer_to_offset (pattern, &pattern[erroffset]);
-
- tmp_error = g_error_new (G_REGEX_ERROR, errcode,
- _("Error while compiling regular "
- "expression %s at char %d: %s"),
- pattern, erroffset, errmsg);
- g_propagate_error (error, tmp_error);
-
- return NULL;
- }
-
- /* For options set at the beginning of the pattern, pcre puts them into
- * compile options, e.g. "(?i)foo" will make the pcre structure store
- * PCRE_CASELESS even though it wasn't explicitly given for compilation. */
- pcre_fullinfo (re, NULL, PCRE_INFO_OPTIONS, &pcre_compile_options);
- compile_options = pcre_compile_options;
-
- if (!(compile_options & G_REGEX_DUPNAMES))
- {
- gboolean jchanged = FALSE;
- pcre_fullinfo (re, NULL, PCRE_INFO_JCHANGED, &jchanged);
- if (jchanged)
- compile_options |= G_REGEX_DUPNAMES;
- }
-
- 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);
-
- g_regex_unref (regex);
- 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_get_compile_flags:
- * @regex: a #GRegex
- *
- * Returns the compile options that @regex was created with.
- *
- * Returns: flags from #GRegexCompileFlags
- *
- * Since: 2.26
- */
-GRegexCompileFlags
-g_regex_get_compile_flags (const GRegex *regex)
-{
- g_return_val_if_fail (regex != NULL, 0);
-
- return regex->compile_opts;
-}
-
-/**
- * g_regex_get_match_flags:
- * @regex: a #GRegex
- *
- * Returns the match options that @regex was created with.
- *
- * Returns: flags from #GRegexMatchFlags
- *
- * Since: 2.26
- */
-GRegexMatchFlags
-g_regex_get_match_flags (const GRegex *regex)
-{
- g_return_val_if_fail (regex != NULL, 0);
-
- return regex->match_opts;
-}
-
-/**
- * g_regex_match_simple:
- * @pattern: the regular expression
- * @string: the string to scan for matches
- * @compile_options: compile options for the regular expression, or 0
- * @match_options: match options, or 0
- *
- * 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 if 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: (out) (allow-none): 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().
- *
- * |[
- * 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, &amp;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);
- * }
- * ]|
- *
- * @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.
- *
- * 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: (array length=string_len): 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: (out) (allow-none): pointer to location where to store
- * the #GMatchInfo, or %NULL if you do not need it
- * @error: location to store the error occurring, 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().
- *
- * |[
- * 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, &amp;match_info, &amp;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, &amp;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);
- * }
- * }
- * ]|
- *
- * 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: (out) (allow-none): 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.
- *
- * @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.
- *
- * 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: (array length=string_len): 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: (out) (allow-none): pointer to location where to store
- * the #GMatchInfo, or %NULL if you do not need it
- * @error: location to store the error occurring, 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 possible
- * 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.
- *
- * @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.
- *
- * 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, or 0
- * @match_options: match options, or 0
- *
- * 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 array of strings. 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: (array length=string_len): 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_free_full (list, g_free);
- 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] = NULL;
- 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_free_full (list, (GDestroyNotify) free_interpolation_data);
- 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: (array length=string_len): 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 occurring, or %NULL to ignore errors
- *
- * Replaces all occurrences 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_free_full (list, (GDestroyNotify) free_interpolation_data);
-
- 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: (array length=string_len): 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 occurring, or %NULL to ignore errors
- *
- * Replaces all occurrences 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: (array length=string_len): 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 occurring, or %NULL to ignore errors
- *
- * Replaces occurrences of the pattern in regex with the output of
- * @eval for that occurrence.
- *
- * 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".
- *
- * The following example uses g_regex_replace_eval() to replace multiple
- * strings at once:
- * |[
- * static gboolean
- * eval_cb (const GMatchInfo *info,
- * GString *res,
- * gpointer data)
- * {
- * gchar *match;
- * gchar *r;
- *
- * match = g_match_info_fetch (info, 0);
- * r = g_hash_table_lookup ((GHashTable *)data, match);
- * g_string_append (res, r);
- * g_free (match);
- *
- * return FALSE;
- * }
- *
- * /&ast; ... &ast;/
- *
- * GRegex *reg;
- * GHashTable *h;
- * gchar *res;
- *
- * h = g_hash_table_new (g_str_hash, g_str_equal);
- *
- * g_hash_table_insert (h, "1", "ONE");
- * g_hash_table_insert (h, "2", "TWO");
- * g_hash_table_insert (h, "3", "THREE");
- * g_hash_table_insert (h, "4", "FOUR");
- *
- * reg = g_regex_new ("1|2|3|4", 0, 0, NULL);
- * res = g_regex_replace_eval (reg, text, -1, 0, 0, eval_cb, h, NULL);
- * g_hash_table_destroy (h);
- *
- * /&ast; ... &ast;/
- * ]|
- *
- * 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: (out) (allow-none): 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_free_full (list, (GDestroyNotify) free_interpolation_data);
-
- return TRUE;
-}
-
-/**
- * g_regex_escape_nul:
- * @string: the string to escape
- * @length: the length of @string
- *
- * Escapes the nul characters in @string to "\x00". It can be used
- * to compile a regex with embedded nul characters.
- *
- * For completeness, @length can be -1 for a nul-terminated string.
- * In this case the output string will be of course equal to @string.
- *
- * Returns: a newly-allocated escaped string
- *
- * Since: 2.30
- */
-gchar *
-g_regex_escape_nul (const gchar *string,
- gint length)
-{
- GString *escaped;
- const gchar *p, *piece_start, *end;
- gint backslashes;
-
- g_return_val_if_fail (string != NULL, NULL);
-
- if (length < 0)
- return g_strdup (string);
-
- end = string + length;
- p = piece_start = string;
- escaped = g_string_sized_new (length + 1);
-
- backslashes = 0;
- while (p < end)
- {
- switch (*p)
- {
- case '\0':
- if (p != piece_start)
- {
- /* copy the previous piece. */
- g_string_append_len (escaped, piece_start, p - piece_start);
- }
- if ((backslashes & 1) == 0)
- g_string_append_c (escaped, '\\');
- g_string_append_c (escaped, 'x');
- g_string_append_c (escaped, '0');
- g_string_append_c (escaped, '0');
- piece_start = ++p;
- backslashes = 0;
- break;
- case '\\':
- backslashes++;
- ++p;
- break;
- default:
- backslashes = 0;
- 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);
-}
-
-/**
- * g_regex_escape_string:
- * @string: (array length=length): 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);
-}
diff --git a/glib/glib/gregex.h b/glib/glib/gregex.h
deleted file mode 100644
index 1110ad0..0000000
--- a/glib/glib/gregex.h
+++ /dev/null
@@ -1,475 +0,0 @@
-/* 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
- */
-
-#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
-#error "Only <glib.h> can be included directly."
-#endif
-
-#ifndef __G_REGEX_H__
-#define __G_REGEX_H__
-
-#include <glib/gerror.h>
-#include <glib/gstring.h>
-
-G_BEGIN_DECLS
-
-/**
- * GRegexError:
- * @G_REGEX_ERROR_COMPILE: Compilation of the regular expression 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.
- * @G_REGEX_ERROR_INTERNAL: Internal error of the regular expression engine.
- * Since 2.16
- * @G_REGEX_ERROR_STRAY_BACKSLASH: "\\" at end of pattern. Since 2.16
- * @G_REGEX_ERROR_MISSING_CONTROL_CHAR: "\\c" at end of pattern. Since 2.16
- * @G_REGEX_ERROR_UNRECOGNIZED_ESCAPE: Unrecognized character follows "\\".
- * Since 2.16
- * @G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER: Numbers out of order in "{}"
- * quantifier. Since 2.16
- * @G_REGEX_ERROR_QUANTIFIER_TOO_BIG: Number too big in "{}" quantifier.
- * Since 2.16
- * @G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS: Missing terminating "]" for
- * character class. Since 2.16
- * @G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS: Invalid escape sequence
- * in character class. Since 2.16
- * @G_REGEX_ERROR_RANGE_OUT_OF_ORDER: Range out of order in character class.
- * Since 2.16
- * @G_REGEX_ERROR_NOTHING_TO_REPEAT: Nothing to repeat. Since 2.16
- * @G_REGEX_ERROR_UNRECOGNIZED_CHARACTER: Unrecognized character after "(?",
- * "(?&lt;" or "(?P". Since 2.16
- * @G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS: POSIX named classes are
- * supported only within a class. Since 2.16
- * @G_REGEX_ERROR_UNMATCHED_PARENTHESIS: Missing terminating ")" or ")"
- * without opening "(". Since 2.16
- * @G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE: Reference to non-existent
- * subpattern. Since 2.16
- * @G_REGEX_ERROR_UNTERMINATED_COMMENT: Missing terminating ")" after comment.
- * Since 2.16
- * @G_REGEX_ERROR_EXPRESSION_TOO_LARGE: Regular expression too large.
- * Since 2.16
- * @G_REGEX_ERROR_MEMORY_ERROR: Failed to get memory. Since 2.16
- * @G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND: Lookbehind assertion is not
- * fixed length. Since 2.16
- * @G_REGEX_ERROR_MALFORMED_CONDITION: Malformed number or name after "(?(".
- * Since 2.16
- * @G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES: Conditional group contains
- * more than two branches. Since 2.16
- * @G_REGEX_ERROR_ASSERTION_EXPECTED: Assertion expected after "(?(".
- * Since 2.16
- * @G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME: Unknown POSIX class name.
- * Since 2.16
- * @G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED: POSIX collating
- * elements are not supported. Since 2.16
- * @G_REGEX_ERROR_HEX_CODE_TOO_LARGE: Character value in "\\x{...}" sequence
- * is too large. Since 2.16
- * @G_REGEX_ERROR_INVALID_CONDITION: Invalid condition "(?(0)". Since 2.16
- * @G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND: \\C not allowed in
- * lookbehind assertion. Since 2.16
- * @G_REGEX_ERROR_INFINITE_LOOP: Recursive call could loop indefinitely.
- * Since 2.16
- * @G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR: Missing terminator
- * in subpattern name. Since 2.16
- * @G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME: Two named subpatterns have
- * the same name. Since 2.16
- * @G_REGEX_ERROR_MALFORMED_PROPERTY: Malformed "\\P" or "\\p" sequence.
- * Since 2.16
- * @G_REGEX_ERROR_UNKNOWN_PROPERTY: Unknown property name after "\\P" or
- * "\\p". Since 2.16
- * @G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG: Subpattern name is too long
- * (maximum 32 characters). Since 2.16
- * @G_REGEX_ERROR_TOO_MANY_SUBPATTERNS: Too many named subpatterns (maximum
- * 10,000). Since 2.16
- * @G_REGEX_ERROR_INVALID_OCTAL_VALUE: Octal value is greater than "\\377".
- * Since 2.16
- * @G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE: "DEFINE" group contains more
- * than one branch. Since 2.16
- * @G_REGEX_ERROR_DEFINE_REPETION: Repeating a "DEFINE" group is not allowed.
- * Since 2.16
- * @G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS: Inconsistent newline options.
- * Since 2.16
- * @G_REGEX_ERROR_MISSING_BACK_REFERENCE: "\\g" is not followed by a braced
- * name or an optionally braced non-zero number. Since 2.16
- *
- * Error codes returned by regular expressions functions.
- *
- * Since: 2.14
- */
-typedef enum
-{
- G_REGEX_ERROR_COMPILE,
- G_REGEX_ERROR_OPTIMIZE,
- G_REGEX_ERROR_REPLACE,
- G_REGEX_ERROR_MATCH,
- G_REGEX_ERROR_INTERNAL,
-
- /* These are the error codes from PCRE + 100 */
- G_REGEX_ERROR_STRAY_BACKSLASH = 101,
- G_REGEX_ERROR_MISSING_CONTROL_CHAR = 102,
- G_REGEX_ERROR_UNRECOGNIZED_ESCAPE = 103,
- G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER = 104,
- G_REGEX_ERROR_QUANTIFIER_TOO_BIG = 105,
- G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS = 106,
- G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS = 107,
- G_REGEX_ERROR_RANGE_OUT_OF_ORDER = 108,
- G_REGEX_ERROR_NOTHING_TO_REPEAT = 109,
- G_REGEX_ERROR_UNRECOGNIZED_CHARACTER = 112,
- G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS = 113,
- G_REGEX_ERROR_UNMATCHED_PARENTHESIS = 114,
- G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE = 115,
- G_REGEX_ERROR_UNTERMINATED_COMMENT = 118,
- G_REGEX_ERROR_EXPRESSION_TOO_LARGE = 120,
- G_REGEX_ERROR_MEMORY_ERROR = 121,
- G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND = 125,
- G_REGEX_ERROR_MALFORMED_CONDITION = 126,
- G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES = 127,
- G_REGEX_ERROR_ASSERTION_EXPECTED = 128,
- G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME = 130,
- G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED = 131,
- G_REGEX_ERROR_HEX_CODE_TOO_LARGE = 134,
- G_REGEX_ERROR_INVALID_CONDITION = 135,
- G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND = 136,
- G_REGEX_ERROR_INFINITE_LOOP = 140,
- G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR = 142,
- G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME = 143,
- G_REGEX_ERROR_MALFORMED_PROPERTY = 146,
- G_REGEX_ERROR_UNKNOWN_PROPERTY = 147,
- G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG = 148,
- G_REGEX_ERROR_TOO_MANY_SUBPATTERNS = 149,
- G_REGEX_ERROR_INVALID_OCTAL_VALUE = 151,
- G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE = 154,
- G_REGEX_ERROR_DEFINE_REPETION = 155,
- G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS = 156,
- G_REGEX_ERROR_MISSING_BACK_REFERENCE = 157
-} GRegexError;
-
-/**
- * G_REGEX_ERROR:
- *
- * Error domain for regular expressions. Errors in this domain will be
- * from the #GRegexError enumeration. See #GError for information on
- * error domains.
- *
- * Since: 2.14
- */
-#define G_REGEX_ERROR g_regex_error_quark ()
-
-GQuark g_regex_error_quark (void);
-
-/**
- * GRegexCompileFlags:
- * @G_REGEX_CASELESS: Letters in the pattern match both upper- and
- * lowercase letters. This option can 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'.
- *
- * Flags specifying compile-time options.
- *
- * Since: 2.14
- */
-/* 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;
-
-/**
- * GRegexMatchFlags:
- * @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_match_info_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.
- *
- * Flags specifying match-time options.
- *
- * Since: 2.14
- */
-/* 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;
-
-/**
- * GRegex:
- *
- * A GRegex is the "compiled" form of a regular expression pattern. This
- * structure is opaque and its fields cannot be accessed directly.
- *
- * Since: 2.14
- */
-typedef struct _GRegex GRegex;
-
-
-typedef struct _GMatchInfo GMatchInfo;
-
-/**
- * GRegexEvalCallback:
- * @match_info: 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.
- * @result: a #GString containing the new string
- * @user_data: user data passed to g_regex_replace_eval()
- *
- * Specifies the type of the function passed to g_regex_replace_eval().
- * It is called for each occurrence of the pattern in the string passed
- * to g_regex_replace_eval(), and it should append the replacement to
- * @result.
- *
- * Returns: %FALSE to continue the replacement process, %TRUE to stop it
- *
- * Since: 2.14
- */
-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);
-gchar *g_regex_escape_nul (const gchar *string,
- gint length);
-
-GRegexCompileFlags g_regex_get_compile_flags (const GRegex *regex);
-GRegexMatchFlags g_regex_get_match_flags (const GRegex *regex);
-
-/* 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);
-
-GMatchInfo *g_match_info_ref (GMatchInfo *match_info);
-void g_match_info_unref (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/glib/glib/gscanner.c b/glib/glib/gscanner.c
index ce56142..9fc5e7c 100644
--- a/glib/glib/gscanner.c
+++ b/glib/glib/gscanner.c
@@ -1363,9 +1363,9 @@ g_scanner_unexp_token (GScanner *scanner,
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);
+ _g_snprintf (token_string, token_string_len, "character '%c'", scanner->token);
else
- _g_snprintf (token_string, token_string_len, "character `\\%o'", scanner->token);
+ _g_snprintf (token_string, token_string_len, "character '\\%o'", scanner->token);
break;
}
else if (!scanner->config->symbol_2_token)
@@ -1382,7 +1382,7 @@ g_scanner_unexp_token (GScanner *scanner,
if (symbol_name)
_g_snprintf (token_string,
token_string_len,
- "%s%s `%s'",
+ "%s%s '%s'",
print_unexp ? "" : "invalid ",
symbol_spec,
symbol_name);
@@ -1435,7 +1435,7 @@ g_scanner_unexp_token (GScanner *scanner,
break;
case G_TOKEN_CHAR:
- _g_snprintf (token_string, token_string_len, "character `%c'", scanner->value.v_char);
+ _g_snprintf (token_string, token_string_len, "character '%c'", scanner->value.v_char);
break;
case G_TOKEN_IDENTIFIER:
@@ -1445,7 +1445,7 @@ g_scanner_unexp_token (GScanner *scanner,
print_unexp = FALSE;
_g_snprintf (token_string,
token_string_len,
- "%s%s `%s'",
+ "%s%s '%s'",
print_unexp ? "" : "invalid ",
identifier_spec,
scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null");
@@ -1456,13 +1456,13 @@ g_scanner_unexp_token (GScanner *scanner,
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);
+ _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);
+ _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);
+ _g_snprintf (token_string, token_string_len, "number '%.3f'", scanner->value.v_float);
break;
case G_TOKEN_STRING:
@@ -1508,9 +1508,9 @@ g_scanner_unexp_token (GScanner *scanner,
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);
+ _g_snprintf (expected_string, expected_string_len, "character '%c'", expected_token);
else
- _g_snprintf (expected_string, expected_string_len, "character `\\%o'", expected_token);
+ _g_snprintf (expected_string, expected_string_len, "character '\\%o'", expected_token);
break;
}
else if (!scanner->config->symbol_2_token)
diff --git a/glib/glib/gscanner.h b/glib/glib/gscanner.h
index dd932f4..499d6e5 100644
--- a/glib/glib/gscanner.h
+++ b/glib/glib/gscanner.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_SCANNER_H__
+#define __G_SCANNER_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SCANNER_H__
-#define __G_SCANNER_H__
-
#include <glib/gdataset.h>
#include <glib/ghash.h>
@@ -152,8 +152,8 @@ struct _GScannerConfig
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_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 */
@@ -212,39 +212,58 @@ struct _GScanner
GScannerMsgFunc msg_handler;
};
+GLIB_AVAILABLE_IN_ALL
GScanner* g_scanner_new (const GScannerConfig *config_templ);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_destroy (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_input_file (GScanner *scanner,
gint input_fd);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_sync_file_offset (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_input_text (GScanner *scanner,
const gchar *text,
guint text_len);
+GLIB_AVAILABLE_IN_ALL
GTokenType g_scanner_get_next_token (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
GTokenType g_scanner_peek_next_token (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
GTokenType g_scanner_cur_token (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
GTokenValue g_scanner_cur_value (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
guint g_scanner_cur_line (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
guint g_scanner_cur_position (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
gboolean g_scanner_eof (GScanner *scanner);
+GLIB_AVAILABLE_IN_ALL
guint g_scanner_set_scope (GScanner *scanner,
guint scope_id);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_scope_add_symbol (GScanner *scanner,
guint scope_id,
const gchar *symbol,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_scope_remove_symbol (GScanner *scanner,
guint scope_id,
const gchar *symbol);
+GLIB_AVAILABLE_IN_ALL
gpointer g_scanner_scope_lookup_symbol (GScanner *scanner,
guint scope_id,
const gchar *symbol);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_scope_foreach_symbol (GScanner *scanner,
guint scope_id,
GHFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gpointer g_scanner_lookup_symbol (GScanner *scanner,
const gchar *symbol);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_unexp_token (GScanner *scanner,
GTokenType expected_token,
const gchar *identifier_spec,
@@ -252,9 +271,11 @@ void g_scanner_unexp_token (GScanner *scanner,
const gchar *symbol_name,
const gchar *message,
gint is_error);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_error (GScanner *scanner,
const gchar *format,
...) G_GNUC_PRINTF (2,3);
+GLIB_AVAILABLE_IN_ALL
void g_scanner_warn (GScanner *scanner,
const gchar *format,
...) G_GNUC_PRINTF (2,3);
diff --git a/glib/glib/gscripttable.h b/glib/glib/gscripttable.h
index 80f9c9c..087669c 100644
--- a/glib/glib/gscripttable.h
+++ b/glib/glib/gscripttable.h
@@ -1,7 +1,7 @@
/* gscripttable.h: Generated by gen-script-table.pl
*
- * Date: Fri Feb 10 17:20:57 2012
- * Source: Scripts-6.1.0.txt
+ * Date: Fri Aug 31 18:19:29 2012
+ * Source: Scripts-6.2.0.txt
*
* Do not edit.
*/
@@ -553,7 +553,7 @@ static const guchar g_script_easy_table[8192] = {
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_INHERITED,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
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,
@@ -2757,7 +2757,7 @@ static const struct {
{ 0x207f, 1, G_UNICODE_SCRIPT_LATIN },
{ 0x2080, 15, G_UNICODE_SCRIPT_COMMON },
{ 0x2090, 13, G_UNICODE_SCRIPT_LATIN },
- { 0x20a0, 26, G_UNICODE_SCRIPT_COMMON },
+ { 0x20a0, 27, G_UNICODE_SCRIPT_COMMON },
{ 0x20d0, 33, G_UNICODE_SCRIPT_INHERITED },
{ 0x2100, 38, G_UNICODE_SCRIPT_COMMON },
{ 0x2126, 1, G_UNICODE_SCRIPT_GREEK },
diff --git a/glib/glib/gsequence.c b/glib/glib/gsequence.c
index ee3da34..ec23aca 100644
--- a/glib/glib/gsequence.c
+++ b/glib/glib/gsequence.c
@@ -79,13 +79,14 @@
* @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.
*
* 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.
+ *
+ * Returns: zero if the iterators are equal, a negative value if @a
+ * comes before @b, and a positive value if @b comes before
+ * @a.
**/
typedef struct _GSequenceNode GSequenceNode;
@@ -828,7 +829,8 @@ g_sequence_search (GSequence *seq,
* </para></note>
*
* Return value: an #GSequenceIter pointing to the position of the
- * first item found equal to @data according to @cmp_func and @cmp_data.
+ * first item found equal to @data according to @cmp_func and
+ * @cmp_data, or %NULL if no such item exists.
*
* Since: 2.28
**/
@@ -1122,7 +1124,7 @@ g_sequence_search_iter (GSequence *seq,
*
* Return value: an #GSequenceIter pointing to the position of
* the first item found equal to @data according to @cmp_func
- * and @cmp_data.
+ * and @cmp_data, or %NULL if no such item exists.
*
* Since: 2.28
**/
diff --git a/glib/glib/gsequence.h b/glib/glib/gsequence.h
index 3e5a03d..81d06a2 100644
--- a/glib/glib/gsequence.h
+++ b/glib/glib/gsequence.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_SEQUENCE_H__
+#define __G_SEQUENCE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SEQUENCE_H__
-#define __G_SEQUENCE_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -38,71 +38,97 @@ typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a,
/* GSequence */
+GLIB_AVAILABLE_IN_ALL
GSequence * g_sequence_new (GDestroyNotify data_destroy);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_free (GSequence *seq);
+GLIB_AVAILABLE_IN_ALL
gint g_sequence_get_length (GSequence *seq);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_foreach (GSequence *seq,
GFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_foreach_range (GSequenceIter *begin,
GSequenceIter *end,
GFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_sort (GSequence *seq,
GCompareDataFunc cmp_func,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_sort_iter (GSequence *seq,
GSequenceIterCompareFunc cmp_func,
gpointer cmp_data);
/* Getting iters */
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_get_begin_iter (GSequence *seq);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_get_end_iter (GSequence *seq);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_get_iter_at_pos (GSequence *seq,
gint pos);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_append (GSequence *seq,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_prepend (GSequence *seq,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_insert_before (GSequenceIter *iter,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_move (GSequenceIter *src,
GSequenceIter *dest);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_swap (GSequenceIter *a,
GSequenceIter *b);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_insert_sorted (GSequence *seq,
gpointer data,
GCompareDataFunc cmp_func,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_insert_sorted_iter (GSequence *seq,
gpointer data,
GSequenceIterCompareFunc iter_cmp,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_sort_changed (GSequenceIter *iter,
GCompareDataFunc cmp_func,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_sort_changed_iter (GSequenceIter *iter,
GSequenceIterCompareFunc iter_cmp,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_remove (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_remove_range (GSequenceIter *begin,
GSequenceIter *end);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_move_range (GSequenceIter *dest,
GSequenceIter *begin,
GSequenceIter *end);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_search (GSequence *seq,
gpointer data,
GCompareDataFunc cmp_func,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_search_iter (GSequence *seq,
gpointer data,
GSequenceIterCompareFunc iter_cmp,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_lookup (GSequence *seq,
gpointer data,
GCompareDataFunc cmp_func,
gpointer cmp_data);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_lookup_iter (GSequence *seq,
gpointer data,
GSequenceIterCompareFunc iter_cmp,
@@ -110,24 +136,35 @@ GSequenceIter *g_sequence_lookup_iter (GSequence *seq,
/* Dereferencing */
+GLIB_AVAILABLE_IN_ALL
gpointer g_sequence_get (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
void g_sequence_set (GSequenceIter *iter,
gpointer data);
/* Operations on GSequenceIter * */
+GLIB_AVAILABLE_IN_ALL
gboolean g_sequence_iter_is_begin (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
gboolean g_sequence_iter_is_end (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_iter_next (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_iter_prev (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
gint g_sequence_iter_get_position (GSequenceIter *iter);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_iter_move (GSequenceIter *iter,
gint delta);
+GLIB_AVAILABLE_IN_ALL
GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter);
/* Search */
+GLIB_AVAILABLE_IN_ALL
gint g_sequence_iter_compare (GSequenceIter *a,
GSequenceIter *b);
+GLIB_AVAILABLE_IN_ALL
GSequenceIter *g_sequence_range_get_midpoint (GSequenceIter *begin,
GSequenceIter *end);
diff --git a/glib/glib/gshell.c b/glib/glib/gshell.c
index 205519e..2891206 100644
--- a/glib/glib/gshell.c
+++ b/glib/glib/gshell.c
@@ -31,6 +31,7 @@
#include "gstring.h"
#include "gtestutils.h"
#include "glibintl.h"
+#include "gthread.h"
/**
* SECTION:shell
@@ -54,11 +55,7 @@
*
* Error codes returned by shell functions.
**/
-GQuark
-g_shell_error_quark (void)
-{
- return g_quark_from_static_string ("g-shell-error-quark");
-}
+G_DEFINE_QUARK (g-shell-error-quark, g_shell_error)
/* Single quotes preserve the literal string exactly. escape
* sequences are not allowed; not even \' - if you want a '
@@ -521,12 +518,30 @@ tokenize_command_line (const gchar *command_line,
g_string_append_c (current_token, *p);
/* FALL THRU */
-
- case '#':
case '\\':
current_quote = *p;
break;
+ case '#':
+ if (p == command_line)
+ { /* '#' was the first char */
+ current_quote = *p;
+ break;
+ }
+ switch(*(p-1))
+ {
+ case ' ':
+ case '\n':
+ case '\0':
+ current_quote = *p;
+ break;
+ default:
+ ensure_token (&current_token);
+ g_string_append_c (current_token, *p);
+ break;
+ }
+ break;
+
default:
/* Combines rules 4) and 6) - if we have a token, append to it,
* otherwise create a new token.
diff --git a/glib/glib/gshell.h b/glib/glib/gshell.h
index ddb4ec5..cff6c5c 100644
--- a/glib/glib/gshell.h
+++ b/glib/glib/gshell.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_SHELL_H__
+#define __G_SHELL_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SHELL_H__
-#define __G_SHELL_H__
-
#include <glib/gerror.h>
G_BEGIN_DECLS
@@ -40,11 +40,15 @@ typedef enum
G_SHELL_ERROR_FAILED
} GShellError;
+GLIB_AVAILABLE_IN_ALL
GQuark g_shell_error_quark (void);
+GLIB_AVAILABLE_IN_ALL
gchar* g_shell_quote (const gchar *unquoted_string);
+GLIB_AVAILABLE_IN_ALL
gchar* g_shell_unquote (const gchar *quoted_string,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_shell_parse_argv (const gchar *command_line,
gint *argcp,
gchar ***argvp,
diff --git a/glib/glib/gslice.c b/glib/glib/gslice.c
index b70724d..e380b9f 100644
--- a/glib/glib/gslice.c
+++ b/glib/glib/gslice.c
@@ -53,6 +53,8 @@
#include "gthread.h"
#include "glib_trace.h"
+#include "valgrind.h"
+
/**
* SECTION:memory_slices
* @title: Memory Slices
@@ -382,6 +384,17 @@ slice_config_init (SliceConfig *config)
if (flags & (1 << 1))
config->debug_blocks = TRUE;
}
+ else
+ {
+ /* G_SLICE was not specified, so check if valgrind is running and
+ * disable ourselves if it is.
+ *
+ * This way it's possible to force gslice to be enabled under
+ * valgrind just by setting G_SLICE to the empty string.
+ */
+ if (RUNNING_ON_VALGRIND)
+ config->always_malloc = TRUE;
+ }
}
static void
diff --git a/glib/glib/gslice.h b/glib/glib/gslice.h
index 4b4b9e5..e1b6686 100644
--- a/glib/glib/gslice.h
+++ b/glib/glib/gslice.h
@@ -17,25 +17,30 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_SLICE_H__
+#define __G_SLICE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SLICE_H__
-#define __G_SLICE_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
/* slices - fast allocation/release of small memory blocks
*/
+GLIB_AVAILABLE_IN_ALL
gpointer g_slice_alloc (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
gpointer g_slice_copy (gsize block_size,
gconstpointer mem_block) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
+GLIB_AVAILABLE_IN_ALL
void g_slice_free1 (gsize block_size,
gpointer mem_block);
+GLIB_AVAILABLE_IN_ALL
void g_slice_free_chain_with_offset (gsize block_size,
gpointer mem_chain,
gsize next_offset);
@@ -77,10 +82,19 @@ typedef enum {
G_SLICE_CONFIG_CHUNK_SIZES,
G_SLICE_CONFIG_CONTENTION_COUNTER
} GSliceConfig;
+
+GLIB_DEPRECATED_IN_2_34
void g_slice_set_config (GSliceConfig ckey, gint64 value);
+GLIB_DEPRECATED_IN_2_34
gint64 g_slice_get_config (GSliceConfig ckey);
+GLIB_DEPRECATED_IN_2_34
gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values);
+#ifdef G_ENABLE_DEBUG
+GLIB_AVAILABLE_IN_ALL
+void g_slice_debug_tree_statistics (void);
+#endif
+
G_END_DECLS
#endif /* __G_SLICE_H__ */
diff --git a/glib/glib/gslist.c b/glib/glib/gslist.c
index 89e0f2d..7cec285 100644
--- a/glib/glib/gslist.c
+++ b/glib/glib/gslist.c
@@ -98,9 +98,10 @@
/**
* g_slist_next:
* @slist: an element in a #GSList.
- * @Returns: the next element, or %NULL if there are no more elements.
*
* A convenience macro to get the next element in a #GSList.
+ *
+ * Returns: the next element, or %NULL if there are no more elements.
**/
#define _g_slist_alloc0() g_slice_new0 (GSList)
@@ -109,11 +110,12 @@
/**
* g_slist_alloc:
- * @Returns: a pointer to the newly-allocated #GSList element.
*
* 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.
+ *
+ * Returns: a pointer to the newly-allocated #GSList element.
**/
GSList*
g_slist_alloc (void)
@@ -515,6 +517,12 @@ _g_slist_remove_link (GSList *list,
* link is set to %NULL, so that it becomes a
* self-contained list with one element.
*
+ * <note>Removing arbitrary nodes from a singly-linked list
+ * requires time that is proportional to the length of the list
+ * (ie. O(n)). If you find yourself using g_slist_remove_link()
+ * frequently, you should consider a different data structure, such
+ * as the doubly-linked #GList.</note>
+ *
* Returns: the new start of the #GSList, without the element
*/
GSList*
@@ -533,6 +541,12 @@ g_slist_remove_link (GSList *list,
* Compare this to g_slist_remove_link() which removes the node
* without freeing it.
*
+ * <note>Removing arbitrary nodes from a singly-linked list
+ * requires time that is proportional to the length of the list
+ * (ie. O(n)). If you find yourself using g_slist_delete_link()
+ * frequently, you should consider a different data structure, such
+ * as the doubly-linked #GList.</note>
+ *
* Returns: the new head of @list
*/
GSList*
@@ -554,7 +568,8 @@ g_slist_delete_link (GSList *list,
* <note><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.
+ * the actual data isn't. See g_slist_copy_deep() if you need
+ * to copy the data as well.
* </para></note>
*
* Returns: a copy of @list
@@ -562,6 +577,41 @@ g_slist_delete_link (GSList *list,
GSList*
g_slist_copy (GSList *list)
{
+ return g_slist_copy_deep (list, NULL, NULL);
+}
+
+/**
+ * g_slist_copy_deep:
+ * @list: a #GSList
+ * @func: a copy function used to copy every element in the list
+ * @user_data: user data passed to the copy function @func, or #NULL
+ *
+ * Makes a full (deep) copy of a #GSList.
+ *
+ * In contrast with g_slist_copy(), this function uses @func to make a copy of
+ * each list element, in addition to copying the list container itself.
+ *
+ * @func, as a #GCopyFunc, takes two arguments, the data to be copied and a user
+ * pointer. It's safe to pass #NULL as user_data, if the copy function takes only
+ * one argument.
+ *
+ * For instance, if @list holds a list of GObjects, you can do:
+ * |[
+ * another_list = g_slist_copy_deep (list, (GCopyFunc) g_object_ref, NULL);
+ * ]|
+ *
+ * And, to entirely free the new list, you could do:
+ * |[
+ * g_slist_free_full (another_list, g_object_unref);
+ * ]|
+ *
+ * Returns: a full copy of @list, use #g_slist_free_full to free it
+ *
+ * Since: 2.34
+ */
+GSList*
+g_slist_copy_deep (GSList *list, GCopyFunc func, gpointer user_data)
+{
GSList *new_list = NULL;
if (list)
@@ -569,14 +619,20 @@ g_slist_copy (GSList *list)
GSList *last;
new_list = _g_slist_alloc ();
- new_list->data = list->data;
+ if (func)
+ new_list->data = func (list->data, user_data);
+ else
+ 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;
+ if (func)
+ last->data = func (list->data, user_data);
+ else
+ last->data = list->data;
list = list->next;
}
last->next = NULL;
diff --git a/glib/glib/gslist.h b/glib/glib/gslist.h
index 5652145..55b91c6 100644
--- a/glib/glib/gslist.h
+++ b/glib/glib/gslist.h
@@ -24,14 +24,15 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_SLIST_H__
+#define __G_SLIST_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SLIST_H__
-#define __G_SLIST_H__
-
#include <glib/gmem.h>
+#include <glib/gnode.h>
G_BEGIN_DECLS
@@ -45,62 +46,95 @@ struct _GSList
/* Singly linked lists
*/
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
void g_slist_free (GSList *list);
+GLIB_AVAILABLE_IN_ALL
void g_slist_free_1 (GSList *list);
#define g_slist_free1 g_slist_free_1
+GLIB_AVAILABLE_IN_ALL
void g_slist_free_full (GSList *list,
GDestroyNotify free_func);
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_append (GSList *list,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_prepend (GSList *list,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_insert (GSList *list,
gpointer data,
gint position) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_insert_sorted (GSList *list,
gpointer data,
GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_insert_sorted_with_data (GSList *list,
gpointer data,
GCompareDataFunc func,
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_insert_before (GSList *slist,
GSList *sibling,
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_concat (GSList *list1,
GSList *list2) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_remove (GSList *list,
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_remove_all (GSList *list,
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_remove_link (GSList *list,
GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_delete_link (GSList *list,
GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
+
+GLIB_AVAILABLE_IN_2_34
+GSList* g_slist_copy_deep (GSList *list,
+ GCopyFunc func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_nth (GSList *list,
guint n);
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_find (GSList *list,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_find_custom (GSList *list,
gconstpointer data,
GCompareFunc func);
+GLIB_AVAILABLE_IN_ALL
gint g_slist_position (GSList *list,
GSList *llink);
+GLIB_AVAILABLE_IN_ALL
gint g_slist_index (GSList *list,
gconstpointer data);
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_last (GSList *list);
+GLIB_AVAILABLE_IN_ALL
guint g_slist_length (GSList *list);
+GLIB_AVAILABLE_IN_ALL
void g_slist_foreach (GSList *list,
GFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_sort (GSList *list,
GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
GSList* g_slist_sort_with_data (GSList *list,
GCompareDataFunc compare_func,
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GLIB_AVAILABLE_IN_ALL
gpointer g_slist_nth_data (GSList *list,
guint n);
diff --git a/glib/glib/gspawn-win32-helper.c b/glib/glib/gspawn-win32-helper.c
index 40108bb..7896941 100644
--- a/glib/glib/gspawn-win32-helper.c
+++ b/glib/glib/gspawn-win32-helper.c
@@ -23,6 +23,15 @@
#include <fcntl.h>
+/* For _CrtSetReportMode, we don't want Windows CRT (2005 and later)
+ * to terminate the process if a bad file descriptor is passed into
+ * _get_osfhandle. The newer MS CRT's are picky
+ * on double close()'s and bad file descriptors.
+ */
+#if (defined (_MSC_VER) && _MSC_VER >= 1400)
+#include <crtdbg.h>
+#endif
+
#undef G_LOG_DOMAIN
#include "glib.h"
#define GSPAWN_HELPER
@@ -147,6 +156,32 @@ protect_wargv (wchar_t **wargv,
return argc;
}
+#if (defined (_MSC_VER) && _MSC_VER >= 1400)
+/*
+ * This is the (empty) invalid parameter handler
+ * that is used for Visual C++ 2005 (and later) builds
+ * so that we can use this instead of the system automatically
+ * aborting the process, as the newer MS CRTs are more picky
+ * about double close()'s and bad/invalid file descriptors.
+ *
+ * This is necessary as we use _get_oshandle() to check the validity
+ * of the file descriptors as we close them, so when an invalid file
+ * descriptor is passed into that function as we check on it, we get
+ * -1 as the result, instead of the gspawn helper program aborting.
+ */
+void myInvalidParameterHandler(
+ const wchar_t * expression,
+ const wchar_t * function,
+ const wchar_t * file,
+ unsigned int line,
+ uintptr_t pReserved
+)
+{
+ return;
+}
+#endif
+
+
#ifndef HELPER_CONSOLE
int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
@@ -173,6 +208,21 @@ main (int ignored_argc, char **ignored_argv)
_startupinfo si = { 0 };
char c;
+ /* store up the file descriptors to close */
+ GSList *fd_toclose = NULL;
+ GSList *last_item = NULL;
+
+#if (defined (_MSC_VER) && _MSC_VER >= 1400)
+ /* set up our empty invalid parameter handler */
+ _invalid_parameter_handler oldHandler, newHandler;
+ newHandler = myInvalidParameterHandler;
+ oldHandler = _set_invalid_parameter_handler(newHandler);
+
+ /* Disable the message box for assertions. */
+ _CrtSetReportMode(_CRT_ASSERT, 0);
+#endif
+
+
g_assert (__argc >= ARG_COUNT);
/* Fetch the wide-char argument vector */
@@ -217,7 +267,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 0)
{
dup2 (fd, 0);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
else
@@ -226,7 +276,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 0)
{
dup2 (fd, 0);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
@@ -238,7 +288,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 1)
{
dup2 (fd, 1);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
else
@@ -247,7 +297,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 1)
{
dup2 (fd, 1);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
@@ -259,7 +309,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 2)
{
dup2 (fd, 2);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
else
@@ -268,7 +318,7 @@ main (int ignored_argc, char **ignored_argv)
if (fd != 2)
{
dup2 (fd, 2);
- close (fd);
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (fd));
}
}
@@ -287,7 +337,22 @@ main (int ignored_argc, char **ignored_argv)
if (__argv[ARG_CLOSE_DESCRIPTORS][0] == 'y')
for (i = 3; i < 1000; i++) /* FIXME real limit? */
if (i != child_err_report_fd && i != helper_sync_fd)
- close (i);
+ if (_get_osfhandle (i) != -1)
+ fd_toclose = g_slist_append (fd_toclose, GINT_TO_POINTER (i));
+
+ /* ...so we won't get the nasty off-by-1 file descriptor leak */
+ fd_toclose = g_slist_append (fd_toclose, NULL);
+ last_item = g_slist_last (fd_toclose);
+
+ /* now close all the file descriptors as necessary */
+ if (fd_toclose != NULL && last_item != NULL)
+ {
+ for ( ; fd_toclose != last_item; fd_toclose = fd_toclose->next)
+ close (GPOINTER_TO_INT(fd_toclose->data));
+ }
+ g_slist_free (last_item);
+ g_slist_free (fd_toclose);
+
/* We don't want our child to inherit the error report and
* helper sync fds.
diff --git a/glib/glib/gspawn-win32.c b/glib/glib/gspawn-win32.c
index 44ae907..2acbde3 100644
--- a/glib/glib/gspawn-win32.c
+++ b/glib/glib/gspawn-win32.c
@@ -45,8 +45,10 @@
#include "config.h"
#include "glib.h"
+#include "glib-private.h"
#include "gprintfint.h"
#include "glibintl.h"
+#include "gthread.h"
#include <string.h>
#include <stdlib.h>
@@ -60,6 +62,7 @@
#include <direct.h>
#include <wchar.h>
+#ifndef GSPAWN_HELPER
#ifdef G_SPAWN_WIN32_DEBUG
static int debug = 1;
#define SETUP_DEBUG() /* empty */
@@ -78,6 +81,7 @@
} \
G_STMT_END
#endif
+#endif
enum
{
@@ -205,11 +209,8 @@ protect_argv (gchar **argv,
return argc;
}
-GQuark
-g_spawn_error_quark (void)
-{
- return g_quark_from_static_string ("g-exec-error-quark");
-}
+G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error)
+G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error)
gboolean
g_spawn_async_utf8 (const gchar *working_directory,
@@ -547,7 +548,6 @@ do_spawn_with_pipes (gint *exit_status,
gchar *helper_process;
CONSOLE_CURSOR_INFO cursor_info;
wchar_t *whelper, **wargv, **wenvp;
- extern gchar *_glib_get_dll_directory (void);
gchar *glib_dll_directory;
if (child_setup && !warned_about_child_setup)
@@ -1221,6 +1221,25 @@ g_spawn_close_pid (GPid pid)
CloseHandle (pid);
}
+gboolean
+g_spawn_check_exit_status (gint exit_status,
+ GError **error)
+{
+ gboolean ret = FALSE;
+
+ if (exit_status != 0)
+ {
+ g_set_error (error, G_SPAWN_EXIT_ERROR, exit_status,
+ _("Child process exited with code %ld"),
+ (long) exit_status);
+ goto out;
+ }
+
+ ret = TRUE;
+ out:
+ return ret;
+}
+
#if !defined (_WIN64)
/* Binary compatibility versions that take system codepage pathnames,
diff --git a/glib/glib/gspawn.c b/glib/glib/gspawn.c
index e0a19ae..3db3c8d 100644
--- a/glib/glib/gspawn.c
+++ b/glib/glib/gspawn.c
@@ -42,6 +42,8 @@
#endif /* HAVE_SYS_RESOURCE_H */
#include "gspawn.h"
+#include "gthread.h"
+#include "glib/gstdio.h"
#include "genviron.h"
#include "gmem.h"
@@ -64,7 +66,8 @@
static gint g_execute (const gchar *file,
gchar **argv,
gchar **envp,
- gboolean search_path);
+ gboolean search_path,
+ gboolean search_path_from_envp);
static gboolean make_pipe (gint p[2],
GError **error);
@@ -74,6 +77,7 @@ static gboolean fork_exec_with_pipes (gboolean intermediate_child,
gchar **envp,
gboolean close_descriptors,
gboolean search_path,
+ gboolean search_path_from_envp,
gboolean stdout_to_null,
gboolean stderr_to_null,
gboolean child_inherits_stdin,
@@ -86,11 +90,8 @@ static gboolean fork_exec_with_pipes (gboolean intermediate_child,
gint *standard_error,
GError **error);
-GQuark
-g_spawn_error_quark (void)
-{
- return g_quark_from_static_string ("g-exec-error-quark");
-}
+G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error)
+G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error)
/**
* g_spawn_async:
@@ -149,23 +150,16 @@ g_spawn_async (const gchar *working_directory,
* on a file descriptor twice, and another thread has
* re-opened it since the first close)
*/
-static gint
+static void
close_and_invalidate (gint *fd)
{
- gint ret;
-
if (*fd < 0)
- return -1;
+ return;
else
{
- again:
- ret = close (*fd);
- if (ret == -1 && errno == EINTR)
- goto again;
+ (void) g_close (*fd, NULL);
*fd = -1;
}
-
- return ret;
}
/* Some versions of OS X define READ_OK in public headers */
@@ -230,13 +224,15 @@ read_data (GString *str,
* if those parameters are non-%NULL. Note that you must set the
* %G_SPAWN_STDOUT_TO_DEV_NULL and %G_SPAWN_STDERR_TO_DEV_NULL flags when
* passing %NULL for @standard_output and @standard_error.
- * 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.
- * Note that this function call waitpid() even if @exit_status is %NULL, and
- * does not accept the %G_SPAWN_DO_NOT_REAP_CHILD flag.
- * If an error occurs, no data is returned in @standard_output,
- * @standard_error, or @exit_status.
+ *
+ * If @exit_status is non-%NULL, the platform-specific exit status of
+ * the child is stored there; see the documentation of
+ * g_spawn_check_exit_status() for how to use and interpret this.
+ * Note that it is invalid to pass %G_SPAWN_DO_NOT_REAP_CHILD in
+ * @flags.
+ *
+ * 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
@@ -288,6 +284,7 @@ g_spawn_sync (const gchar *working_directory,
envp,
!(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN),
(flags & G_SPAWN_SEARCH_PATH) != 0,
+ (flags & G_SPAWN_SEARCH_PATH_FROM_ENVP) != 0,
(flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0,
(flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
(flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
@@ -412,7 +409,7 @@ g_spawn_sync (const gchar *working_directory,
{
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.");
+ g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_spawn_sync either directly or indirectly.");
}
else
{
@@ -480,8 +477,15 @@ g_spawn_sync (const gchar *working_directory,
* 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.
+ * the program must be a full path. If @flags contains the
+ * %G_SPAWN_SEARCH_PATH flag, the <envar>PATH</envar> environment variable
+ * is used to search for the executable. If @flags contains the
+ * %G_SPAWN_SEARCH_PATH_FROM_ENVP flag, the <envar>PATH</envar> variable from
+ * @envp is used to search for the executable.
+ * If both the %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP
+ * flags are set, the <envar>PATH</envar> variable from @envp takes precedence
+ * over the environment variable.
+ *
* If the program name is not a full path and %G_SPAWN_SEARCH_PATH flag is not
* used, then the program will be run from the current directory (or
* @working_directory, if specified); this might be unexpected or even
@@ -547,7 +551,11 @@ g_spawn_sync (const gchar *working_directory,
* 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>.
+ * will be looked for in the <envar>PATH</envar> environment variable.
+ * %G_SPAWN_SEARCH_PATH_FROM_ENVP means need not be an absolute path, it
+ * will be looked for in the <envar>PATH</envar> variable from @envp. If
+ * both %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP are used,
+ * the value from @envp takes precedence over the environment.
* %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.
@@ -656,6 +664,7 @@ g_spawn_async_with_pipes (const gchar *working_directory,
envp,
!(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN),
(flags & G_SPAWN_SEARCH_PATH) != 0,
+ (flags & G_SPAWN_SEARCH_PATH_FROM_ENVP) != 0,
(flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0,
(flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
(flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
@@ -686,9 +695,9 @@ g_spawn_async_with_pipes (const gchar *working_directory,
* 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.
+ * If @exit_status is non-%NULL, the platform-specific exit status of
+ * the child is stored there; see the documentation of
+ * g_spawn_check_exit_status() for how to use and interpret this.
*
* On Windows, please note the implications of g_shell_parse_argv()
* parsing @command_line. Parsing is done according to Unix shell rules, not
@@ -778,6 +787,96 @@ g_spawn_command_line_async (const gchar *command_line,
return retval;
}
+/**
+ * g_spawn_check_exit_status:
+ * @exit_status: An exit code as returned from g_spawn_sync()
+ * @error: a #GError
+ *
+ * Set @error if @exit_status indicates the child exited abnormally
+ * (e.g. with a nonzero exit code, or via a fatal signal).
+ *
+ * The g_spawn_sync() and g_child_watch_add() family of APIs return an
+ * exit status for subprocesses encoded in a platform-specific way.
+ * On Unix, this is guaranteed to be in the same format
+ * <literal>waitpid(2)</literal> returns, and on Windows it is
+ * guaranteed to be the result of
+ * <literal>GetExitCodeProcess()</literal>. Prior to the introduction
+ * of this function in GLib 2.34, interpreting @exit_status required
+ * use of platform-specific APIs, which is problematic for software
+ * using GLib as a cross-platform layer.
+ *
+ * Additionally, many programs simply want to determine whether or not
+ * the child exited successfully, and either propagate a #GError or
+ * print a message to standard error. In that common case, this
+ * function can be used. Note that the error message in @error will
+ * contain human-readable information about the exit status.
+ *
+ * The <literal>domain</literal> and <literal>code</literal> of @error
+ * have special semantics in the case where the process has an "exit
+ * code", as opposed to being killed by a signal. On Unix, this
+ * happens if <literal>WIFEXITED</literal> would be true of
+ * @exit_status. On Windows, it is always the case.
+ *
+ * The special semantics are that the actual exit code will be the
+ * code set in @error, and the domain will be %G_SPAWN_EXIT_ERROR.
+ * This allows you to differentiate between different exit codes.
+ *
+ * If the process was terminated by some means other than an exit
+ * status, the domain will be %G_SPAWN_ERROR, and the code will be
+ * %G_SPAWN_ERROR_FAILED.
+ *
+ * This function just offers convenience; you can of course also check
+ * the available platform via a macro such as %G_OS_UNIX, and use
+ * <literal>WIFEXITED()</literal> and <literal>WEXITSTATUS()</literal>
+ * on @exit_status directly. Do not attempt to scan or parse the
+ * error message string; it may be translated and/or change in future
+ * versions of GLib.
+ *
+ * Returns: %TRUE if child exited successfully, %FALSE otherwise (and @error will be set)
+ * Since: 2.34
+ */
+gboolean
+g_spawn_check_exit_status (gint exit_status,
+ GError **error)
+{
+ gboolean ret = FALSE;
+
+ if (WIFEXITED (exit_status))
+ {
+ if (WEXITSTATUS (exit_status) != 0)
+ {
+ g_set_error (error, G_SPAWN_EXIT_ERROR, WEXITSTATUS (exit_status),
+ _("Child process exited with code %ld"),
+ (long) WEXITSTATUS (exit_status));
+ goto out;
+ }
+ }
+ else if (WIFSIGNALED (exit_status))
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Child process killed by signal %ld"),
+ (long) WTERMSIG (exit_status));
+ goto out;
+ }
+ else if (WIFSTOPPED (exit_status))
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Child process stopped by signal %ld"),
+ (long) WSTOPSIG (exit_status));
+ goto out;
+ }
+ else
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Child process exited abnormally"));
+ goto out;
+ }
+
+ ret = TRUE;
+ out:
+ return ret;
+}
+
static gint
exec_err_to_g_error (gint en)
{
@@ -1040,6 +1139,7 @@ do_exec (gint child_err_report_fd,
gchar **envp,
gboolean close_descriptors,
gboolean search_path,
+ gboolean search_path_from_envp,
gboolean stdout_to_null,
gboolean stderr_to_null,
gboolean child_inherits_stdin,
@@ -1133,7 +1233,7 @@ do_exec (gint child_err_report_fd,
g_execute (argv[0],
file_and_argv_zero ? argv + 1 : argv,
- envp, search_path);
+ envp, search_path, search_path_from_envp);
/* Exec failed */
write_err_and_exit (child_err_report_fd,
@@ -1196,6 +1296,7 @@ fork_exec_with_pipes (gboolean intermediate_child,
gchar **envp,
gboolean close_descriptors,
gboolean search_path,
+ gboolean search_path_from_envp,
gboolean stdout_to_null,
gboolean stderr_to_null,
gboolean child_inherits_stdin,
@@ -1294,6 +1395,7 @@ fork_exec_with_pipes (gboolean intermediate_child,
}
else if (grandchild_pid == 0)
{
+ close_and_invalidate (&child_pid_report_pipe[1]);
do_exec (child_err_report_pipe[1],
stdin_pipe[0],
stdout_pipe[1],
@@ -1303,6 +1405,7 @@ fork_exec_with_pipes (gboolean intermediate_child,
envp,
close_descriptors,
search_path,
+ search_path_from_envp,
stdout_to_null,
stderr_to_null,
child_inherits_stdin,
@@ -1332,6 +1435,7 @@ fork_exec_with_pipes (gboolean intermediate_child,
envp,
close_descriptors,
search_path,
+ search_path_from_envp,
stdout_to_null,
stderr_to_null,
child_inherits_stdin,
@@ -1533,8 +1637,7 @@ make_pipe (gint p[2],
static void
script_execute (const gchar *file,
gchar **argv,
- gchar **envp,
- gboolean search_path)
+ gchar **envp)
{
/* Count the arguments. */
int argc = 0;
@@ -1579,7 +1682,8 @@ static gint
g_execute (const gchar *file,
gchar **argv,
gchar **envp,
- gboolean search_path)
+ gboolean search_path,
+ gboolean search_path_from_envp)
{
if (*file == '\0')
{
@@ -1588,7 +1692,7 @@ g_execute (const gchar *file,
return -1;
}
- if (!search_path || strchr (file, '/') != NULL)
+ if (!(search_path || search_path_from_envp) || strchr (file, '/') != NULL)
{
/* Don't search when it contains a slash. */
if (envp)
@@ -1597,7 +1701,7 @@ g_execute (const gchar *file,
execv (file, argv);
if (errno == ENOEXEC)
- script_execute (file, argv, envp, FALSE);
+ script_execute (file, argv, envp);
}
else
{
@@ -1607,12 +1711,17 @@ g_execute (const gchar *file,
gsize len;
gsize pathlen;
- path = g_getenv ("PATH");
+ path = NULL;
+ if (search_path_from_envp)
+ path = g_environ_getenv (envp, "PATH");
+ if (search_path && path == NULL)
+ path = g_getenv ("PATH");
+
if (path == NULL)
{
- /* There is no `PATH' in the environment. The default
+ /* 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'.
+ * the path 'confstr' returns for '_CS_PATH'.
*/
/* In GLib we put . last, for security, and don't use the
@@ -1643,7 +1752,7 @@ g_execute (const gchar *file,
if (p == path)
/* Two adjacent colons, or a colon at the beginning or the end
- * of `PATH' means to search the current directory.
+ * of 'PATH' means to search the current directory.
*/
startp = name + 1;
else
@@ -1656,12 +1765,12 @@ g_execute (const gchar *file,
execv (startp, argv);
if (errno == ENOEXEC)
- script_execute (startp, argv, envp, search_path);
+ script_execute (startp, argv, envp);
switch (errno)
{
case EACCES:
- /* Record the we got a `Permission denied' error. If we end
+ /* 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.
*/
diff --git a/glib/glib/gspawn.h b/glib/glib/gspawn.h
index bdac189..5b5853a 100644
--- a/glib/glib/gspawn.h
+++ b/glib/glib/gspawn.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_SPAWN_H__
+#define __G_SPAWN_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_SPAWN_H__
-#define __G_SPAWN_H__
-
#include <glib/gerror.h>
G_BEGIN_DECLS
@@ -97,6 +97,14 @@ typedef enum
} GSpawnError;
/**
+ * G_SPAWN_EXIT_ERROR:
+ *
+ * Error domain used by g_spawn_check_exit_status(). The code
+ * will be the program exit code.
+ */
+#define G_SPAWN_EXIT_ERROR g_spawn_exit_error_quark ()
+
+/**
* GSpawnChildSetupFunc:
* @user_data: user data to pass to the function.
*
@@ -136,6 +144,7 @@ typedef void (* GSpawnChildSetupFunc) (gpointer user_data);
/**
* GSpawnFlags:
+ * @G_SPAWN_DEFAULT: no flags, default behaviour
* @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.
@@ -155,11 +164,15 @@ typedef void (* GSpawnChildSetupFunc) (gpointer user_data);
* 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.
+ * @G_SPAWN_SEARCH_PATH_FROM_ENVP: if <literal>argv[0]</literal> is not an abolute path,
+ * it will be looked for in the <envar>PATH</envar> from the passed child
+ * environment. Since: 2.34
*
* Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes().
*/
typedef enum
{
+ G_SPAWN_DEFAULT = 0,
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() */
@@ -168,21 +181,16 @@ typedef enum
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
+ G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6,
+ G_SPAWN_SEARCH_PATH_FROM_ENVP = 1 << 7
} GSpawnFlags;
+GLIB_AVAILABLE_IN_ALL
GQuark g_spawn_error_quark (void);
+GLIB_AVAILABLE_IN_ALL
+GQuark g_spawn_exit_error_quark (void);
-#ifndef __GTK_DOC_IGNORE__
-#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
-#endif
-
+GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_async (const gchar *working_directory,
gchar **argv,
gchar **envp,
@@ -196,6 +204,7 @@ gboolean g_spawn_async (const gchar *working_directory,
/* Opens pipes for non-NULL standard_output, standard_input, standard_error,
* and returns the parent's end of the pipes.
*/
+GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_async_with_pipes (const gchar *working_directory,
gchar **argv,
gchar **envp,
@@ -213,6 +222,7 @@ gboolean g_spawn_async_with_pipes (const gchar *working_directory,
* standard output or error of the command will be placed there.
*/
+GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_sync (const gchar *working_directory,
gchar **argv,
gchar **envp,
@@ -224,16 +234,74 @@ gboolean g_spawn_sync (const gchar *working_directory,
gint *exit_status,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_command_line_sync (const gchar *command_line,
gchar **standard_output,
gchar **standard_error,
gint *exit_status,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_command_line_async (const gchar *command_line,
GError **error);
+GLIB_AVAILABLE_IN_2_34
+gboolean g_spawn_check_exit_status (gint exit_status,
+ GError **error);
+
+GLIB_AVAILABLE_IN_ALL
void g_spawn_close_pid (GPid pid);
+#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
+
+GLIB_AVAILABLE_IN_ALL
+gboolean g_spawn_async_utf8 (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_pid,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+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_pid,
+ gint *standard_input,
+ gint *standard_output,
+ gint *standard_error,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+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);
+
+GLIB_AVAILABLE_IN_ALL
+gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line,
+ gchar **standard_output,
+ gchar **standard_error,
+ gint *exit_status,
+ GError **error);
+GLIB_AVAILABLE_IN_ALL
+gboolean g_spawn_command_line_async_utf8 (const gchar *command_line,
+ GError **error);
+#endif
+
G_END_DECLS
#endif /* __G_SPAWN_H__ */
diff --git a/glib/glib/gstdio.c b/glib/glib/gstdio.c
index 6d763e1..cca4ff5 100644
--- a/glib/glib/gstdio.c
+++ b/glib/glib/gstdio.c
@@ -40,6 +40,7 @@
#include <sys/utime.h>
#else
#include <utime.h>
+#include <errno.h>
#endif
#include "gstdio.h"
@@ -209,7 +210,11 @@ g_open (const gchar *filename,
errno = save_errno;
return retval;
#else
- return open (filename, flags, mode);
+ int fd;
+ do
+ fd = open (filename, flags, mode);
+ while (G_UNLIKELY (fd == -1 && errno == EINTR));
+ return fd;
#endif
}
@@ -830,3 +835,48 @@ g_utime (const gchar *filename,
return utime (filename, utb);
#endif
}
+
+/**
+ * g_close:
+ * @fd: A file descriptor
+ * @error: a #GError
+ *
+ * This wraps the close() call; in case of error, %errno will be
+ * preserved, but the error will also be stored as a #GError in @error.
+ *
+ * Besides using #GError, there is another major reason to prefer this
+ * function over the call provided by the system; on Unix, it will
+ * attempt to correctly handle %EINTR, which has platform-specific
+ * semantics.
+ *
+ * Since: 2.36
+ */
+gboolean
+g_close (gint fd,
+ GError **error)
+{
+ int res;
+ res = close (fd);
+ /* Just ignore EINTR for now; a retry loop is the wrong thing to do
+ * on Linux at least. Anyone who wants to add a conditional check
+ * for e.g. HP-UX is welcome to do so later...
+ *
+ * http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
+ * https://bugzilla.gnome.org/show_bug.cgi?id=682819
+ * http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
+ * https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
+ */
+ if (G_UNLIKELY (res == -1 && errno == EINTR))
+ return TRUE;
+ else if (res == -1)
+ {
+ int errsv = errno;
+ g_set_error_literal (error, G_FILE_ERROR,
+ g_file_error_from_errno (errsv),
+ g_strerror (errsv));
+ errno = errsv;
+ return FALSE;
+ }
+ return TRUE;
+}
+
diff --git a/glib/glib/gstdio.h b/glib/glib/gstdio.h
index 08aea7d..90ee74e 100644
--- a/glib/glib/gstdio.h
+++ b/glib/glib/gstdio.h
@@ -74,13 +74,17 @@ typedef struct stat GStatBuf;
#define g_utime utime
#endif
+GLIB_AVAILABLE_IN_ALL
int g_access (const gchar *filename,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_chdir (const gchar *path);
+GLIB_AVAILABLE_IN_ALL
int g_unlink (const gchar *filename);
+GLIB_AVAILABLE_IN_ALL
int g_rmdir (const gchar *filename);
#else /* ! G_OS_UNIX */
@@ -95,42 +99,56 @@ int g_rmdir (const gchar *filename);
* API.
*/
+GLIB_AVAILABLE_IN_ALL
int g_access (const gchar *filename,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_chmod (const gchar *filename,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_open (const gchar *filename,
int flags,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_creat (const gchar *filename,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_rename (const gchar *oldfilename,
const gchar *newfilename);
+GLIB_AVAILABLE_IN_ALL
int g_mkdir (const gchar *filename,
int mode);
+GLIB_AVAILABLE_IN_ALL
int g_chdir (const gchar *path);
+GLIB_AVAILABLE_IN_ALL
int g_stat (const gchar *filename,
GStatBuf *buf);
+GLIB_AVAILABLE_IN_ALL
int g_lstat (const gchar *filename,
GStatBuf *buf);
+GLIB_AVAILABLE_IN_ALL
int g_unlink (const gchar *filename);
+GLIB_AVAILABLE_IN_ALL
int g_remove (const gchar *filename);
+GLIB_AVAILABLE_IN_ALL
int g_rmdir (const gchar *filename);
+GLIB_AVAILABLE_IN_ALL
FILE *g_fopen (const gchar *filename,
const gchar *mode);
+GLIB_AVAILABLE_IN_ALL
FILE *g_freopen (const gchar *filename,
const gchar *mode,
FILE *stream);
@@ -139,11 +157,16 @@ struct utimbuf; /* Don't need the real definition of struct utimbuf when just
* including this header.
*/
+GLIB_AVAILABLE_IN_ALL
int g_utime (const gchar *filename,
struct utimbuf *utb);
#endif /* G_OS_UNIX */
+GLIB_AVAILABLE_IN_2_36
+gboolean g_close (gint fd,
+ GError **error);
+
G_END_DECLS
#endif /* __G_STDIO_H__ */
diff --git a/glib/glib/gstrfuncs.c b/glib/glib/gstrfuncs.c
index 777d12e..4fcd91c 100644
--- a/glib/glib/gstrfuncs.c
+++ b/glib/glib/gstrfuncs.c
@@ -39,9 +39,9 @@
#include <errno.h>
#include <ctype.h> /* For tolower() */
-#ifdef HAVE_XLOCALE_H
-/* Needed on BSD/OS X for e.g. strtod_l */
-#include <xlocale.h>
+#ifdef HAVE_XLOCALE_H
+/* Needed on BSD/OS X for e.g. strtod_l */
+#include <xlocale.h>
#endif
#ifdef G_OS_WIN32
@@ -317,7 +317,15 @@ static const guint16 ascii_table_data[256] = {
const guint16 * const g_ascii_table = ascii_table_data;
-#ifdef HAVE_NEWLOCALE
+#if defined (HAVE_NEWLOCALE) && \
+ defined (HAVE_USELOCALE) && \
+ defined (HAVE_STRTOD_L) && \
+ defined (HAVE_STRTOULL_L) && \
+ defined (HAVE_STRTOLL_L)
+#define USE_XLOCALE 1
+#endif
+
+#ifdef USE_XLOCALE
static locale_t
get_C_locale (void)
{
@@ -683,7 +691,7 @@ gdouble
g_ascii_strtod (const gchar *nptr,
gchar **endptr)
{
-#ifdef HAVE_STRTOD_L
+#ifdef USE_XLOCALE
g_return_val_if_fail (nptr != NULL, 0);
@@ -695,7 +703,9 @@ g_ascii_strtod (const gchar *nptr,
gchar *fail_pos;
gdouble val;
+#ifndef __BIONIC__
struct lconv *locale_data;
+#endif
const char *decimal_point;
int decimal_point_len;
const char *p, *decimal_point_pos;
@@ -706,9 +716,14 @@ g_ascii_strtod (const gchar *nptr,
fail_pos = NULL;
+#ifndef __BIONIC__
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
decimal_point_len = strlen (decimal_point);
+#else
+ decimal_point = ".";
+ decimal_point_len = 1;
+#endif
g_assert (decimal_point_len != 0);
@@ -866,6 +881,9 @@ g_ascii_dtostr (gchar *buffer,
return g_ascii_formatd (buffer, buf_len, "%.17g", d);
}
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
/**
* g_ascii_formatd:
* @buffer: A buffer to place the resulting string in
@@ -890,16 +908,18 @@ g_ascii_formatd (gchar *buffer,
const gchar *format,
gdouble d)
{
-#ifdef HAVE_USELOCALE
+#ifdef USE_XLOCALE
locale_t old_locale;
old_locale = uselocale (get_C_locale ());
- _g_snprintf (buffer, buf_len, format, d);
+ _g_snprintf (buffer, buf_len, format, d);
uselocale (old_locale);
return buffer;
#else
+#ifndef __BIONIC__
struct lconv *locale_data;
+#endif
const char *decimal_point;
int decimal_point_len;
gchar *p;
@@ -930,9 +950,14 @@ g_ascii_formatd (gchar *buffer,
_g_snprintf (buffer, buf_len, format, d);
+#ifndef __BIONIC__
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
decimal_point_len = strlen (decimal_point);
+#else
+ decimal_point = ".";
+ decimal_point_len = 1;
+#endif
g_assert (decimal_point_len != 0);
@@ -966,6 +991,7 @@ g_ascii_formatd (gchar *buffer,
return buffer;
#endif
}
+#pragma GCC diagnostic pop
#define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \
(c) == '\r' || (c) == '\t' || (c) == '\v')
@@ -975,7 +1001,7 @@ g_ascii_formatd (gchar *buffer,
#define TOUPPER(c) (ISLOWER (c) ? (c) - 'a' + 'A' : (c))
#define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c))
-#if !defined(HAVE_STRTOLL_L) || !defined(HAVE_STRTOULL_L)
+#ifndef USE_XLOCALE
static guint64
g_parse_long_long (const gchar *nptr,
@@ -1100,7 +1126,7 @@ g_parse_long_long (const gchar *nptr,
}
return 0;
}
-#endif
+#endif /* !USE_XLOCALE */
/**
* g_ascii_strtoull:
@@ -1136,7 +1162,7 @@ g_ascii_strtoull (const gchar *nptr,
gchar **endptr,
guint base)
{
-#ifdef HAVE_STRTOULL_L
+#ifdef USE_XLOCALE
return strtoull_l (nptr, endptr, base, get_C_locale ());
#else
gboolean negative;
@@ -1183,7 +1209,7 @@ g_ascii_strtoll (const gchar *nptr,
gchar **endptr,
guint base)
{
-#ifdef HAVE_STRTOLL_L
+#ifdef USE_XLOCALE
return strtoll_l (nptr, endptr, base, get_C_locale ());
#else
gboolean negative;
@@ -1851,9 +1877,10 @@ g_strcasecmp (const gchar *s1,
* it doesn't work on many encodings at all, including UTF-8, EUC-JP,
* etc.
*
- * There are therefore two replacement functions: g_ascii_strncasecmp(),
+ * There are therefore two replacement techniques: 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.
+ * g_utf8_casefold() followed by strcmp() on the resulting strings, which is
+ * good for case-insensitive sorting of UTF-8.
**/
gint
g_strncasecmp (const gchar *s1,
diff --git a/glib/glib/gstrfuncs.h b/glib/glib/gstrfuncs.h
index 68c89fd..510623a 100644
--- a/glib/glib/gstrfuncs.h
+++ b/glib/glib/gstrfuncs.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_STRFUNCS_H__
+#define __G_STRFUNCS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_STRFUNCS_H__
-#define __G_STRFUNCS_H__
-
#include <stdarg.h>
#include <glib/gmacros.h>
#include <glib/gtypes.h>
@@ -87,54 +87,74 @@ GLIB_VAR const guint16 * const g_ascii_table;
#define g_ascii_isxdigit(c) \
((g_ascii_table[(guchar) (c)] & G_ASCII_XDIGIT) != 0)
+GLIB_AVAILABLE_IN_ALL
gchar g_ascii_tolower (gchar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gchar g_ascii_toupper (gchar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gint g_ascii_digit_value (gchar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
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 "_-|> <."
+GLIB_AVAILABLE_IN_ALL
gchar* g_strdelimit (gchar *string,
const gchar *delimiters,
gchar new_delimiter);
+GLIB_AVAILABLE_IN_ALL
gchar* g_strcanon (gchar *string,
const gchar *valid_chars,
gchar substitutor);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_strerror (gint errnum) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
const gchar * g_strsignal (gint signum) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gchar * g_strreverse (gchar *string);
+GLIB_AVAILABLE_IN_ALL
gsize g_strlcpy (gchar *dest,
const gchar *src,
gsize dest_size);
+GLIB_AVAILABLE_IN_ALL
gsize g_strlcat (gchar *dest,
const gchar *src,
gsize dest_size);
+GLIB_AVAILABLE_IN_ALL
gchar * g_strstr_len (const gchar *haystack,
gssize haystack_len,
const gchar *needle);
+GLIB_AVAILABLE_IN_ALL
gchar * g_strrstr (const gchar *haystack,
const gchar *needle);
+GLIB_AVAILABLE_IN_ALL
gchar * g_strrstr_len (const gchar *haystack,
gssize haystack_len,
const gchar *needle);
+GLIB_AVAILABLE_IN_ALL
gboolean g_str_has_suffix (const gchar *str,
const gchar *suffix);
+GLIB_AVAILABLE_IN_ALL
gboolean g_str_has_prefix (const gchar *str,
const gchar *prefix);
/* String to/from double conversion functions */
+GLIB_AVAILABLE_IN_ALL
gdouble g_strtod (const gchar *nptr,
gchar **endptr);
+GLIB_AVAILABLE_IN_ALL
gdouble g_ascii_strtod (const gchar *nptr,
gchar **endptr);
+GLIB_AVAILABLE_IN_ALL
guint64 g_ascii_strtoull (const gchar *nptr,
gchar **endptr,
guint base);
+GLIB_AVAILABLE_IN_ALL
gint64 g_ascii_strtoll (const gchar *nptr,
gchar **endptr,
guint base);
@@ -142,28 +162,36 @@ gint64 g_ascii_strtoll (const gchar *nptr,
* g_ascii_dtostr can produce.
* Then add 10 for good measure */
#define G_ASCII_DTOSTR_BUF_SIZE (29 + 10)
+GLIB_AVAILABLE_IN_ALL
gchar * g_ascii_dtostr (gchar *buffer,
gint buf_len,
gdouble d);
+GLIB_AVAILABLE_IN_ALL
gchar * g_ascii_formatd (gchar *buffer,
gint buf_len,
const gchar *format,
gdouble d);
/* removes leading spaces */
+GLIB_AVAILABLE_IN_ALL
gchar* g_strchug (gchar *string);
/* removes trailing spaces */
+GLIB_AVAILABLE_IN_ALL
gchar* g_strchomp (gchar *string);
/* removes leading & trailing spaces */
#define g_strstrip( string ) g_strchomp (g_strchug (string))
+GLIB_AVAILABLE_IN_ALL
gint g_ascii_strcasecmp (const gchar *s1,
const gchar *s2);
+GLIB_AVAILABLE_IN_ALL
gint g_ascii_strncasecmp (const gchar *s1,
const gchar *s2,
gsize n);
+GLIB_AVAILABLE_IN_ALL
gchar* g_ascii_strdown (const gchar *str,
gssize len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_ascii_strup (const gchar *str,
gssize len) G_GNUC_MALLOC;
@@ -184,17 +212,25 @@ gchar* g_strup (gchar *string);
/* String utility functions that return a newly allocated string which
* ought to be freed with g_free from the caller at some point.
*/
+GLIB_AVAILABLE_IN_ALL
gchar* g_strdup (const gchar *str) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strdup_printf (const gchar *format,
...) G_GNUC_PRINTF (1, 2) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strdup_vprintf (const gchar *format,
- va_list args) G_GNUC_MALLOC;
+ va_list args) G_GNUC_PRINTF(1, 0)
+ G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strndup (const gchar *str,
gsize n) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strnfill (gsize length,
gchar fill_char) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strconcat (const gchar *string1,
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strjoin (const gchar *separator,
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
@@ -202,6 +238,7 @@ gchar* g_strjoin (const gchar *separator,
* sequences. Inverse of g_strescape. The recognized sequences are \b
* \f \n \r \t \\ \" and the octal format.
*/
+GLIB_AVAILABLE_IN_ALL
gchar* g_strcompress (const gchar *source) G_GNUC_MALLOC;
/* Copy a string escaping nonprintable characters like in C strings.
@@ -212,9 +249,11 @@ gchar* g_strcompress (const gchar *source) G_GNUC_MALLOC;
* Luckily this function wasn't used much, using NULL as second parameter
* provides mostly identical semantics.
*/
+GLIB_AVAILABLE_IN_ALL
gchar* g_strescape (const gchar *source,
const gchar *exceptions) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gpointer g_memdup (gconstpointer mem,
guint byte_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(2);
@@ -227,18 +266,25 @@ gpointer g_memdup (gconstpointer mem,
* g_strdupv() copies a NULL-terminated array of strings
* g_strv_length() returns the length of a NULL-terminated array of strings
*/
+GLIB_AVAILABLE_IN_ALL
gchar** g_strsplit (const gchar *string,
const gchar *delimiter,
gint max_tokens) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar ** g_strsplit_set (const gchar *string,
const gchar *delimiters,
gint max_tokens) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_strjoinv (const gchar *separator,
gchar **str_array) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
void g_strfreev (gchar **str_array);
+GLIB_AVAILABLE_IN_ALL
gchar** g_strdupv (gchar **str_array) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
guint g_strv_length (gchar **str_array);
+GLIB_AVAILABLE_IN_ALL
gchar* g_stpcpy (gchar *dest,
const char *src);
diff --git a/glib/glib/gstring.c b/glib/glib/gstring.c
index 9fac86c..2f89551 100644
--- a/glib/glib/gstring.c
+++ b/glib/glib/gstring.c
@@ -50,12 +50,17 @@
* @short_description: text buffers which grow automatically
* as text is added
*
- * A #GString is an object that handles the memory management
- * of a C string for you. You can think of it as similar to a
- * Java StringBuffer. In addition to the string itself, GString
- * stores the length of the string, so can be used for binary
- * data with embedded nul bytes. To access the C string managed
- * by the GString @string, simply use @string->str.
+ * A #GString is an object that handles the memory management of a C
+ * string for you. The emphasis of #GString is on text, typically
+ * UTF-8. Crucially, the "str" member of a #GString is guaranteed to
+ * have a trailing nul character, and it is therefore always safe to
+ * call functions such as strchr() or g_strdup() on it.
+ *
+ * However, a #GString can also hold arbitrary binary data, because it
+ * has a "len" member, which includes any possible embedded nul
+ * characters in the data. Conceptually then, #GString is like a
+ * #GByteArray with the addition of many convenience methods for text,
+ * and a guaranteed nul terminator.
*/
/**
@@ -227,6 +232,37 @@ g_string_free (GString *string,
}
/**
+ * g_string_free_to_bytes:
+ * @string: (transfer full): a #GString
+ *
+ * Transfers ownership of the contents of @string to a newly allocated
+ * #GBytes. The #GString structure itself is deallocated, and it is
+ * therefore invalid to use @string after invoking this function.
+ *
+ * Note that while #GString ensures that its buffer always has a
+ * trailing nul character (not reflected in its "len"), the returned
+ * #GBytes does not include this extra nul; i.e. it has length exactly
+ * equal to the "len" member.
+ *
+ * Returns: A newly allocated #GBytes containing contents of @string; @string itself is freed
+ * Since: 2.34
+ */
+GBytes*
+g_string_free_to_bytes (GString *string)
+{
+ gsize len;
+ gchar *buf;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ len = string->len;
+
+ buf = g_string_free (string, FALSE);
+
+ return g_bytes_new_take (buf, len);
+}
+
+/**
* g_string_equal:
* @v: a #GString
* @v2: another #GString
@@ -234,7 +270,7 @@ g_string_free (GString *string,
* 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
+ * Returns: %TRUE if the strings are the same length and contain the
* same bytes
*/
gboolean
diff --git a/glib/glib/gstring.h b/glib/glib/gstring.h
index 0797343..0cbba5d 100644
--- a/glib/glib/gstring.h
+++ b/glib/glib/gstring.h
@@ -24,15 +24,16 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_STRING_H__
+#define __G_STRING_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_STRING_H__
-#define __G_STRING_H__
-
#include <glib/gtypes.h>
#include <glib/gunicode.h>
+#include <glib/gbytes.h>
#include <glib/gutils.h> /* for G_CAN_INLINE */
G_BEGIN_DECLS
@@ -46,76 +47,111 @@ struct _GString
gsize allocated_len;
};
+GLIB_AVAILABLE_IN_ALL
GString* g_string_new (const gchar *init);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_new_len (const gchar *init,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_sized_new (gsize dfl_size);
+GLIB_AVAILABLE_IN_ALL
gchar* g_string_free (GString *string,
gboolean free_segment);
+GLIB_AVAILABLE_IN_2_34
+GBytes* g_string_free_to_bytes (GString *string);
+GLIB_AVAILABLE_IN_ALL
gboolean g_string_equal (const GString *v,
const GString *v2);
+GLIB_AVAILABLE_IN_ALL
guint g_string_hash (const GString *str);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_assign (GString *string,
const gchar *rval);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_truncate (GString *string,
gsize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_set_size (GString *string,
gsize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_insert_len (GString *string,
gssize pos,
const gchar *val,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_append (GString *string,
const gchar *val);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_append_len (GString *string,
const gchar *val,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_append_c (GString *string,
gchar c);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_append_unichar (GString *string,
gunichar wc);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_prepend (GString *string,
const gchar *val);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_prepend_c (GString *string,
gchar c);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_prepend_unichar (GString *string,
gunichar wc);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_prepend_len (GString *string,
const gchar *val,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_insert (GString *string,
gssize pos,
const gchar *val);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_insert_c (GString *string,
gssize pos,
gchar c);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_insert_unichar (GString *string,
gssize pos,
gunichar wc);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_overwrite (GString *string,
gsize pos,
const gchar *val);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_overwrite_len (GString *string,
gsize pos,
const gchar *val,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_erase (GString *string,
gssize pos,
gssize len);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_ascii_down (GString *string);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_ascii_up (GString *string);
+GLIB_AVAILABLE_IN_ALL
void g_string_vprintf (GString *string,
const gchar *format,
- va_list args);
+ va_list args)
+ G_GNUC_PRINTF(2, 0);
+GLIB_AVAILABLE_IN_ALL
void g_string_printf (GString *string,
const gchar *format,
...) G_GNUC_PRINTF (2, 3);
+GLIB_AVAILABLE_IN_ALL
void g_string_append_vprintf (GString *string,
const gchar *format,
- va_list args);
+ va_list args)
+ G_GNUC_PRINTF(2, 0);
+GLIB_AVAILABLE_IN_ALL
void g_string_append_printf (GString *string,
const gchar *format,
...) G_GNUC_PRINTF (2, 3);
+GLIB_AVAILABLE_IN_ALL
GString* g_string_append_uri_escaped (GString *string,
const gchar *unescaped,
const gchar *reserved_chars_allowed,
diff --git a/glib/glib/gstringchunk.h b/glib/glib/gstringchunk.h
index 5ab2e8a..79848e1 100644
--- a/glib/glib/gstringchunk.h
+++ b/glib/glib/gstringchunk.h
@@ -24,27 +24,33 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_STRINGCHUNK_H__
+#define __G_STRINGCHUNK_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_STRINGCHUNK_H__
-#define __G_STRINGCHUNK_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
typedef struct _GStringChunk GStringChunk;
+GLIB_AVAILABLE_IN_ALL
GStringChunk* g_string_chunk_new (gsize size);
+GLIB_AVAILABLE_IN_ALL
void g_string_chunk_free (GStringChunk *chunk);
+GLIB_AVAILABLE_IN_ALL
void g_string_chunk_clear (GStringChunk *chunk);
+GLIB_AVAILABLE_IN_ALL
gchar* g_string_chunk_insert (GStringChunk *chunk,
const gchar *string);
+GLIB_AVAILABLE_IN_ALL
gchar* g_string_chunk_insert_len (GStringChunk *chunk,
const gchar *string,
gssize len);
+GLIB_AVAILABLE_IN_ALL
gchar* g_string_chunk_insert_const (GStringChunk *chunk,
const gchar *string);
diff --git a/glib/glib/gtester-report b/glib/glib/gtester-report
index 0fcdd9a..0131714 100755
--- a/glib/glib/gtester-report
+++ b/glib/glib/gtester-report
@@ -377,7 +377,7 @@ class GTestCase(object):
"""A representation of a gtester test result as a pyunit TestCase."""
def __init__(self, case, binary):
- """Create a GTestCase for case `case` from binary program `binary`."""
+ """Create a GTestCase for case 'case' from binary program 'binary'."""
self._case = case
self._binary = binary
# the name of the case - e.g. /dbusmenu/glib/objects/menuitem/props_boolstr
diff --git a/glib/glib/gtester.c b/glib/glib/gtester.c
index 279f6f2..12f7f1a 100644
--- a/glib/glib/gtester.c
+++ b/glib/glib/gtester.c
@@ -17,7 +17,10 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+#include "config.h"
+
#include <glib.h>
+#include <glib-unix.h>
#include <gstdio.h>
#include <string.h>
#include <stdlib.h>
@@ -127,6 +130,8 @@ test_log_msg (GTestLogMsg *msg)
guint i;
gchar **strv;
case G_TEST_LOG_NONE:
+ case G_TEST_LOG_START_SUITE:
+ case G_TEST_LOG_STOP_SUITE:
break;
case G_TEST_LOG_ERROR:
strv = g_strsplit (msg->strings[0], "\n", -1);
@@ -283,12 +288,13 @@ launch_test_binary (const char *binary,
gboolean loop_pending;
gint i = 0;
- if (pipe (report_pipe) < 0)
+ if (!g_unix_open_pipe (report_pipe, FD_CLOEXEC, &error))
{
if (subtest_mode_fatal)
- g_error ("Failed to open pipe for test binary: %s: %s", binary, g_strerror (errno));
+ g_error ("Failed to open pipe for test binary: %s: %s", binary, error->message);
else
- g_warning ("Failed to open pipe for test binary: %s: %s", binary, g_strerror (errno));
+ g_warning ("Failed to open pipe for test binary: %s: %s", binary, error->message);
+ g_clear_error (&error);
return FALSE;
}
@@ -474,23 +480,24 @@ usage (gboolean just_version)
g_print ("gtester version %d.%d.%d\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
return;
}
- g_print ("Usage: gtester [OPTIONS] testprogram...\n");
+ g_print ("Usage:\n");
+ g_print ("gtester [OPTIONS] testprogram...\n\n");
/* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */
- g_print ("Options:\n");
- g_print (" -h, --help show this help message\n");
- g_print (" -v, --version print version informations\n");
- g_print (" --g-fatal-warnings make warnings fatal (abort)\n");
- g_print (" -k, --keep-going continue running after tests failed\n");
- g_print (" -l list paths of available test cases\n");
- g_print (" -m=perf, -m=slow, -m=quick -m=thorough\n");
- g_print (" run test cases in mode perf, slow/thorough or quick (default)\n");
- g_print (" -m=no-undefined don't run test cases that provoke assertions\n");
- g_print (" -p=TESTPATH only start test cases matching TESTPATH\n");
- g_print (" -s=TESTPATH skip test cases matching TESTPATH\n");
- g_print (" --seed=SEEDSTRING start all tests with random number seed SEEDSTRING\n");
- g_print (" -o=LOGFILE write the test log to LOGFILE\n");
- g_print (" -q, --quiet suppress per test binary output\n");
- g_print (" --verbose report success per testcase\n");
+ g_print ("Help Options:\n");
+ g_print (" -h, --help Show this help message\n\n");
+ g_print ("Utility Options:\n");
+ g_print (" -v, --version Print version informations\n");
+ g_print (" --g-fatal-warnings Make warnings fatal (abort)\n");
+ g_print (" -k, --keep-going Continue running after tests failed\n");
+ g_print (" -l List paths of available test cases\n");
+ g_print (" -m {perf|slow|thorough|quick} Run test cases according to mode\n");
+ g_print (" -m {undefined|no-undefined} Run test cases according to mode\n");
+ g_print (" -p=TESTPATH Only start test cases matching TESTPATH\n");
+ g_print (" -s=TESTPATH Skip test cases matching TESTPATH\n");
+ g_print (" --seed=SEEDSTRING Start tests with random seed SEEDSTRING\n");
+ g_print (" -o=LOGFILE Write the test log to LOGFILE\n");
+ g_print (" -q, --quiet Suppress per test binary output\n");
+ g_print (" --verbose Report success per testcase\n");
}
static void
diff --git a/glib/glib/gtestutils.c b/glib/glib/gtestutils.c
index ffdbea3..353a2db 100644
--- a/glib/glib/gtestutils.c
+++ b/glib/glib/gtestutils.c
@@ -21,6 +21,7 @@
#include "config.h"
#include "gtestutils.h"
+#include "gmessages-private.h"
#include "gfileutils.h"
#include <sys/types.h>
@@ -28,6 +29,7 @@
#include <sys/wait.h>
#include <sys/time.h>
#include <fcntl.h>
+#include <glib/gstdio.h>
#endif
#include <string.h>
#include <stdlib.h>
@@ -35,8 +37,12 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
#ifdef G_OS_WIN32
#include <io.h>
+#include <windows.h>
#endif
#include <errno.h>
#include <signal.h>
@@ -50,6 +56,9 @@
#include "gstrfuncs.h"
#include "gtimer.h"
#include "gslice.h"
+#include "gspawn.h"
+#include "glib-private.h"
+#include "gmessages-private.h"
/**
@@ -105,6 +114,16 @@
*/
/**
+ * g_test_initialized:
+ *
+ * Returns %TRUE if g_test_init() has been called.
+ *
+ * Returns: %TRUE if g_test_init() has been called.
+ *
+ * Since: 2.36
+ */
+
+/**
* g_test_quick:
*
* Returns %TRUE if tests are run in quick mode.
@@ -145,9 +164,8 @@
* g_test_undefined:
*
* Returns %TRUE if tests may provoke assertions and other formally-undefined
- * behaviour under g_test_trap_fork(), to verify that appropriate warnings
- * are given. It can be useful to turn this off if running tests under
- * valgrind.
+ * behaviour, to verify that appropriate warnings are given. It might, in some
+ * cases, be useful to turn this off if running tests under valgrind.
*
* Returns: %TRUE if tests may provoke programming errors
*/
@@ -192,18 +210,42 @@
* console during test runs. The actual output is still captured
* though to allow later tests with g_test_trap_assert_stderr().
* @G_TEST_TRAP_INHERIT_STDIN: If this flag is given, stdin of the
- * forked child process is shared with stdin of its parent process.
+ * child process is shared with stdin of its parent process.
* It is redirected to <filename>/dev/null</filename> otherwise.
*
* Test traps are guards around forked tests.
* These flags determine what traps to set.
+ *
+ * Deprecated: #GTestTrapFlags is used only with g_test_trap_fork(),
+ * which is deprecated. g_test_trap_subprocess() uses
+ * #GTestTrapSubprocessFlags.
+ */
+
+/**
+ * GTestSubprocessFlags:
+ * @G_TEST_SUBPROCESS_INHERIT_STDIN: If this flag is given, the child
+ * process will inherit the parent's stdin. Otherwise, the child's
+ * stdin is redirected to <filename>/dev/null</filename>.
+ * @G_TEST_SUBPROCESS_INHERIT_STDOUT: If this flag is given, the child
+ * process will inherit the parent's stdout. Otherwise, the child's
+ * stdout will not be visible, but it will be captured to allow
+ * later tests with g_test_trap_assert_stdout().
+ * @G_TEST_SUBPROCESS_INHERIT_STDERR: If this flag is given, the child
+ * process will inherit the parent's stderr. Otherwise, the child's
+ * stderr will not be visible, but it will be captured to allow
+ * later tests with g_test_trap_assert_stderr().
+ *
+ * Flags to pass to g_test_trap_subprocess() to control input and output.
+ *
+ * Note that in contrast with g_test_trap_fork(), the default is to
+ * not show stdout and stderr.
*/
/**
* g_test_trap_assert_passed:
*
- * Assert that the last forked test passed.
- * See g_test_trap_fork().
+ * Assert that the last test subprocess passed.
+ * See g_test_trap_subprocess().
*
* Since: 2.16
*/
@@ -211,13 +253,13 @@
/**
* g_test_trap_assert_failed:
*
- * Assert that the last forked test failed.
- * See g_test_trap_fork().
+ * Assert that the last test subprocess failed.
+ * See g_test_trap_subprocess().
*
* This is sometimes used to test situations that are formally considered to
* be undefined behaviour, like inputs that fail a g_return_if_fail()
* check. In these situations you should skip the entire test, including the
- * call to g_test_trap_fork(), unless g_test_undefined() returns %TRUE
+ * call to g_test_trap_subprocess(), unless g_test_undefined() returns %TRUE
* to indicate that undefined behaviour may be tested.
*
* Since: 2.16
@@ -228,8 +270,8 @@
* @soutpattern: a glob-style
* <link linkend="glib-Glob-style-pattern-matching">pattern</link>
*
- * Assert that the stdout output of the last forked test matches
- * @soutpattern. See g_test_trap_fork().
+ * Assert that the stdout output of the last test subprocess matches
+ * @soutpattern. See g_test_trap_subprocess().
*
* Since: 2.16
*/
@@ -239,8 +281,8 @@
* @soutpattern: a glob-style
* <link linkend="glib-Glob-style-pattern-matching">pattern</link>
*
- * Assert that the stdout output of the last forked test
- * does not match @soutpattern. See g_test_trap_fork().
+ * Assert that the stdout output of the last test subprocess
+ * does not match @soutpattern. See g_test_trap_subprocess().
*
* Since: 2.16
*/
@@ -250,14 +292,15 @@
* @serrpattern: a glob-style
* <link linkend="glib-Glob-style-pattern-matching">pattern</link>
*
- * Assert that the stderr output of the last forked test
- * matches @serrpattern. See g_test_trap_fork().
+ * Assert that the stderr output of the last test subprocess
+ * matches @serrpattern. See g_test_trap_subprocess().
*
- * This is sometimes used to test situations that are formally considered to
- * be undefined behaviour, like inputs that fail a g_return_if_fail()
- * check. In these situations you should skip the entire test, including the
- * call to g_test_trap_fork(), unless g_test_undefined() returns %TRUE
- * to indicate that undefined behaviour may be tested.
+ * This is sometimes used to test situations that are formally
+ * considered to be undefined behaviour, like code that hits a
+ * g_assert() or g_error(). In these situations you should skip the
+ * entire test, including the call to g_test_trap_subprocess(), unless
+ * g_test_undefined() returns %TRUE to indicate that undefined
+ * behaviour may be tested.
*
* Since: 2.16
*/
@@ -267,8 +310,8 @@
* @serrpattern: a glob-style
* <link linkend="glib-Glob-style-pattern-matching">pattern</link>
*
- * Assert that the stderr output of the last forked test
- * does not match @serrpattern. See g_test_trap_fork().
+ * Assert that the stderr output of the last test subprocess
+ * does not match @serrpattern. See g_test_trap_subprocess().
*
* Since: 2.16
*/
@@ -306,18 +349,64 @@
*/
/**
+ * g_assert_true:
+ * @expr: the expression to check
+ *
+ * Debugging macro to check that an expression is true.
+ *
+ * If the assertion fails (i.e. the expression is not true),
+ * an error message is logged and the application is either
+ * terminated or the testcase marked as failed.
+ *
+ * See g_test_set_nonfatal_assertions().
+ *
+ * Since: 2.38
+ */
+
+/**
+ * g_assert_false:
+ * @expr: the expression to check
+ *
+ * Debugging macro to check an expression is false.
+ *
+ * If the assertion fails (i.e. the expression is not false),
+ * an error message is logged and the application is either
+ * terminated or the testcase marked as failed.
+ *
+ * See g_test_set_nonfatal_assertions().
+ *
+ * Since: 2.38
+ */
+
+/**
+ * g_assert_null:
+ * @expr: the expression to check
+ *
+ * Debugging macro to check an expression is %NULL.
+ *
+ * If the assertion fails (i.e. the expression is not %NULL),
+ * an error message is logged and the application is either
+ * terminated or the testcase marked as failed.
+ *
+ * See g_test_set_nonfatal_assertions().
+ *
+ * Since: 2.38
+ */
+
+/**
* g_assert_cmpstr:
* @s1: a string (may be %NULL)
* @cmp: The comparison operator to use.
* One of ==, !=, &lt;, &gt;, &lt;=, &gt;=.
* @s2: another string (may be %NULL)
*
- * Debugging macro to terminate the application with a warning
- * message if a string comparison fails. The strings are compared
- * using g_strcmp0().
+ * Debugging macro to compare two strings. If the comparison fails,
+ * an error message is logged and the application is either terminated
+ * or the testcase marked as failed.
+ * The strings are compared using g_strcmp0().
*
* The effect of <literal>g_assert_cmpstr (s1, op, s2)</literal> is
- * the same as <literal>g_assert (g_strcmp0 (s1, s2) op 0)</literal>.
+ * the same as <literal>g_assert_true (g_strcmp0 (s1, s2) op 0)</literal>.
* The advantage of this macro is that it can produce a message that
* includes the actual values of @s1 and @s2.
*
@@ -335,11 +424,10 @@
* One of ==, !=, &lt;, &gt;, &lt;=, &gt;=.
* @n2: another integer
*
- * Debugging macro to terminate the application with a warning
- * message if an integer comparison fails.
+ * Debugging macro to compare two integers.
*
* The effect of <literal>g_assert_cmpint (n1, op, n2)</literal> is
- * the same as <literal>g_assert (n1 op n2)</literal>. The advantage
+ * the same as <literal>g_assert_true (n1 op n2)</literal>. The advantage
* of this macro is that it can produce a message that includes the
* actual values of @n1 and @n2.
*
@@ -353,11 +441,10 @@
* One of ==, !=, &lt;, &gt;, &lt;=, &gt;=.
* @n2: another unsigned integer
*
- * Debugging macro to terminate the application with a warning
- * message if an unsigned integer comparison fails.
+ * Debugging macro to compare two unsigned integers.
*
* The effect of <literal>g_assert_cmpuint (n1, op, n2)</literal> is
- * the same as <literal>g_assert (n1 op n2)</literal>. The advantage
+ * the same as <literal>g_assert_true (n1 op n2)</literal>. The advantage
* of this macro is that it can produce a message that includes the
* actual values of @n1 and @n2.
*
@@ -371,8 +458,7 @@
* One of ==, !=, &lt;, &gt;, &lt;=, &gt;=.
* @n2: another unsigned integer
*
- * Debugging macro to terminate the application with a warning
- * message if an unsigned integer comparison fails.
+ * Debugging macro to compare to unsigned integers.
*
* This is a variant of g_assert_cmpuint() that displays the numbers
* in hexadecimal notation in the message.
@@ -387,11 +473,10 @@
* One of ==, !=, &lt;, &gt;, &lt;=, &gt;=.
* @n2: another floating point number
*
- * Debugging macro to terminate the application with a warning
- * message if a floating point number comparison fails.
+ * Debugging macro to compare two floating point numbers.
*
* The effect of <literal>g_assert_cmpfloat (n1, op, n2)</literal> is
- * the same as <literal>g_assert (n1 op n2)</literal>. The advantage
+ * the same as <literal>g_assert_true (n1 op n2)</literal>. The advantage
* of this macro is that it can produce a message that includes the
* actual values of @n1 and @n2.
*
@@ -402,11 +487,10 @@
* g_assert_no_error:
* @err: a #GError, possibly %NULL
*
- * Debugging macro to terminate the application with a warning
- * message if a method has returned a #GError.
+ * Debugging macro to check that a #GError is not set.
*
* The effect of <literal>g_assert_no_error (err)</literal> is
- * the same as <literal>g_assert (err == NULL)</literal>. The advantage
+ * the same as <literal>g_assert_true (err == NULL)</literal>. The advantage
* of this macro is that it can produce a message that includes
* the error message and code.
*
@@ -419,11 +503,11 @@
* @dom: the expected error domain (a #GQuark)
* @c: the expected error code
*
- * Debugging macro to terminate the application with a warning
- * message if a method has not returned the correct #GError.
+ * Debugging macro to check that a method has returned
+ * the correct #GError.
*
* The effect of <literal>g_assert_error (err, dom, c)</literal> is
- * the same as <literal>g_assert (err != NULL &amp;&amp; err->domain
+ * the same as <literal>g_assert_true (err != NULL &amp;&amp; err->domain
* == dom &amp;&amp; err->code == c)</literal>. The advantage of this
* macro is that it can produce a message that includes the incorrect
* error message and code.
@@ -453,8 +537,12 @@
* analysis systems like Apport and ABRT to fish out assertion messages from
* core dumps, instead of having to catch them on screen output.
*/
+GLIB_VAR char *__glib_assert_msg;
char *__glib_assert_msg = NULL;
+/* --- constants --- */
+#define G_TEST_STATUS_TIMED_OUT 1024
+
/* --- structures --- */
struct GTestCase
{
@@ -490,6 +578,13 @@ static void gtest_default_log_handler (const gchar *log_domain,
gpointer unused_data);
+typedef enum {
+ G_TEST_RUN_SUCCESS,
+ G_TEST_RUN_SKIPPED,
+ G_TEST_RUN_FAILURE,
+ G_TEST_RUN_INCOMPLETE
+} GTestResult;
+
/* --- variables --- */
static int test_log_fd = -1;
static gboolean test_mode_fatal = TRUE;
@@ -498,9 +593,11 @@ static gboolean test_run_list = FALSE;
static gchar *test_run_seedstr = NULL;
static GRand *test_run_rand = NULL;
static gchar *test_run_name = "";
+static GSList **test_filename_free_list;
static guint test_run_forks = 0;
static guint test_run_count = 0;
-static guint test_run_success = FALSE;
+static GTestResult test_run_success = G_TEST_RUN_FAILURE;
+static gchar *test_run_msg = NULL;
static guint test_skip_count = 0;
static GTimer *test_user_timer = NULL;
static double test_user_stamp = 0;
@@ -508,12 +605,21 @@ static GSList *test_paths = NULL;
static GSList *test_paths_skipped = NULL;
static GTestSuite *test_suite_root = NULL;
static int test_trap_last_status = 0;
-static int test_trap_last_pid = 0;
+static GPid test_trap_last_pid = 0;
+static char *test_trap_last_subprocess = NULL;
static char *test_trap_last_stdout = NULL;
static char *test_trap_last_stderr = NULL;
static char *test_uri_base = NULL;
static gboolean test_debug_log = FALSE;
+static gboolean test_tap_log = FALSE;
+static gboolean test_nonfatal_assertions = FALSE;
static DestroyEntry *test_destroy_queue = NULL;
+static char *test_argv0 = NULL;
+static char *test_argv0_dirname;
+static const char *test_disted_files_dir;
+static const char *test_built_files_dir;
+static char *test_initial_cwd = NULL;
+static gboolean test_in_subprocess = FALSE;
static GTestConfig mutable_test_config_vars = {
FALSE, /* test_initialized */
TRUE, /* test_quick */
@@ -540,6 +646,8 @@ g_test_log_type_name (GTestLogType log_type)
case G_TEST_LOG_MIN_RESULT: return "minperf";
case G_TEST_LOG_MAX_RESULT: return "maxperf";
case G_TEST_LOG_MESSAGE: return "message";
+ case G_TEST_LOG_START_SUITE: return "start suite";
+ case G_TEST_LOG_STOP_SUITE: return "stop suite";
}
return "???";
}
@@ -573,7 +681,12 @@ g_test_log_send (guint n_bytes,
{
g_printerr (":(");
for (ui = 0; ui < msg->n_nums; ui++)
- g_printerr ("%s%.16Lg", ui ? ";" : "", msg->nums[ui]);
+ {
+ if ((long double) (long) msg->nums[ui] == msg->nums[ui])
+ g_printerr ("%s%ld", ui ? ";" : "", (long) msg->nums[ui]);
+ else
+ g_printerr ("%s%.16g", ui ? ";" : "", (double) msg->nums[ui]);
+ }
g_printerr (")");
}
g_printerr (":LOG*}\n");
@@ -588,7 +701,7 @@ g_test_log (GTestLogType lbit,
guint n_args,
long double *largs)
{
- gboolean fail = lbit == G_TEST_LOG_STOP_CASE && largs[0] != 0;
+ gboolean fail;
GTestLogMsg msg;
gchar *astrings[3] = { NULL, NULL, NULL };
guint8 *dbuffer;
@@ -597,27 +710,67 @@ g_test_log (GTestLogType lbit,
switch (lbit)
{
case G_TEST_LOG_START_BINARY:
- if (g_test_verbose())
+ if (test_tap_log)
+ g_print ("# random seed: %s\n", string2);
+ else if (g_test_verbose())
g_print ("GTest: random seed: %s\n", string2);
break;
+ case G_TEST_LOG_START_SUITE:
+ if (test_tap_log)
+ {
+ if (string1[0] != 0)
+ g_print ("# Start of %s tests\n", string1);
+ }
+ break;
+ case G_TEST_LOG_STOP_SUITE:
+ if (test_tap_log)
+ {
+ if (string1[0] != 0)
+ g_print ("# End of %s tests\n", string1);
+ else
+ g_print ("1..%d\n", test_run_count);
+ }
+ break;
case G_TEST_LOG_STOP_CASE:
- if (g_test_verbose())
+ fail = largs[0] != G_TEST_RUN_SUCCESS && largs[0] != G_TEST_RUN_SKIPPED;
+ if (test_tap_log)
+ {
+ g_print ("%s %d %s", fail ? "not ok" : "ok", test_run_count, string1);
+ if (largs[0] == G_TEST_RUN_INCOMPLETE)
+ g_print (" # TODO %s\n", string2 ? string2 : "");
+ else if (largs[0] == G_TEST_RUN_SKIPPED)
+ g_print (" # SKIP %s\n", string2 ? string2 : "");
+ else
+ g_print ("\n");
+ }
+ else if (g_test_verbose())
g_print ("GTest: result: %s\n", fail ? "FAIL" : "OK");
else if (!g_test_quiet())
g_print ("%s\n", fail ? "FAIL" : "OK");
if (fail && test_mode_fatal)
- abort();
+ {
+ if (test_tap_log)
+ g_print ("Bail out!\n");
+ abort();
+ }
break;
case G_TEST_LOG_MIN_RESULT:
- if (g_test_verbose())
+ if (test_tap_log)
+ g_print ("# min perf: %s\n", string1);
+ else if (g_test_verbose())
g_print ("(MINPERF:%s)\n", string1);
break;
case G_TEST_LOG_MAX_RESULT:
- if (g_test_verbose())
+ if (test_tap_log)
+ g_print ("# max perf: %s\n", string1);
+ else if (g_test_verbose())
g_print ("(MAXPERF:%s)\n", string1);
break;
case G_TEST_LOG_MESSAGE:
- if (g_test_verbose())
+ case G_TEST_LOG_ERROR:
+ if (test_tap_log)
+ g_print ("# %s\n", string1);
+ else if (g_test_verbose())
g_print ("(MSG: %s)\n", string1);
break;
default: ;
@@ -637,7 +790,9 @@ g_test_log (GTestLogType lbit,
switch (lbit)
{
case G_TEST_LOG_START_CASE:
- if (g_test_verbose())
+ if (test_tap_log)
+ ;
+ else if (g_test_verbose())
g_print ("GTest: run: %s\n", string1);
else if (!g_test_quiet())
g_print ("%s: ", string1);
@@ -656,6 +811,10 @@ parse_args (gint *argc_p,
guint argc = *argc_p;
gchar **argv = *argv_p;
guint i, e;
+
+ test_argv0 = argv[0];
+ test_initial_cwd = g_get_current_dir ();
+
/* parse known args */
for (i = 1; i < argc; i++)
{
@@ -677,6 +836,11 @@ parse_args (gint *argc_p,
test_debug_log = TRUE;
argv[i] = NULL;
}
+ else if (strcmp (argv[i], "--tap") == 0)
+ {
+ test_tap_log = TRUE;
+ argv[i] = NULL;
+ }
else if (strcmp ("--GTestLogFD", argv[i]) == 0 || strncmp ("--GTestLogFD=", argv[i], 13) == 0)
{
gchar *equal = argv[i] + 12;
@@ -701,6 +865,22 @@ parse_args (gint *argc_p,
}
argv[i] = NULL;
}
+ else if (strcmp ("--GTestSubprocess", argv[i]) == 0)
+ {
+ test_in_subprocess = TRUE;
+ /* We typically expect these child processes to crash, and some
+ * tests spawn a *lot* of them. Avoid spamming system crash
+ * collection programs such as systemd-coredump and abrt.
+ */
+#ifdef HAVE_SYS_RESOURCE_H
+ {
+ struct rlimit limit = { 0, 0 };
+ (void) setrlimit (RLIMIT_CORE, &limit);
+ }
+#endif
+ _g_log_set_exit_on_fatal ();
+ argv[i] = NULL;
+ }
else if (strcmp ("-p", argv[i]) == 0 || strncmp ("-p=", argv[i], 3) == 0)
{
gchar *equal = argv[i] + 2;
@@ -784,26 +964,25 @@ parse_args (gint *argc_p,
}
argv[i] = NULL;
}
- else if (strcmp ("-?", argv[i]) == 0 || strcmp ("--help", argv[i]) == 0)
+ else if (strcmp ("-?", argv[i]) == 0 ||
+ strcmp ("-h", argv[i]) == 0 ||
+ strcmp ("--help", argv[i]) == 0)
{
printf ("Usage:\n"
" %s [OPTION...]\n\n"
"Help Options:\n"
- " -?, --help Show help options\n"
+ " -h, --help Show help options\n\n"
"Test Options:\n"
+ " --g-fatal-warnings Make all warnings fatal\n"
" -l List test cases available in a test executable\n"
- " -seed=RANDOMSEED Provide a random seed to reproduce test\n"
- " runs using random numbers\n"
- " --verbose Run tests verbosely\n"
- " -q, --quiet Run tests quietly\n"
- " -p TESTPATH execute all tests matching TESTPATH\n"
- " -s TESTPATH skip all tests matching TESTPATH\n"
- " -m {perf|slow|thorough|quick} Execute tests according modes\n"
- " -m {undefined|no-undefined} Execute tests according modes\n"
+ " -m {perf|slow|thorough|quick} Execute tests according to mode\n"
+ " -m {undefined|no-undefined} Execute tests according to mode\n"
+ " -p TESTPATH Only start test cases matching TESTPATH\n"
+ " -s TESTPATH Skip all tests matching TESTPATH\n"
+ " -seed=SEEDSTRING Start tests with random seed SEEDSTRING\n"
" --debug-log debug test logging output\n"
- " -k, --keep-going gtester-specific argument\n"
- " --GTestLogFD=N gtester-specific argument\n"
- " --GTestSkipCount=N gtester-specific argument\n",
+ " -q, --quiet Run tests quietly\n"
+ " --verbose Run tests verbosely\n",
argv[0]);
exit (0);
}
@@ -836,65 +1015,67 @@ parse_args (gint *argc_p,
* <varlistentry>
* <term><option>-l</option></term>
* <listitem><para>
- * list test cases available in a test executable.
+ * List test cases available in a test executable.
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term><option>--seed=<replaceable>RANDOMSEED</replaceable></option></term>
* <listitem><para>
- * provide a random seed to reproduce test runs using random numbers.
+ * Provide a random seed to reproduce test runs using random numbers.
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term><option>--verbose</option></term>
- * <listitem><para>run tests verbosely.</para></listitem>
+ * <listitem><para>Run tests verbosely.</para></listitem>
* </varlistentry>
* <varlistentry>
* <term><option>-q</option>, <option>--quiet</option></term>
- * <listitem><para>run tests quietly.</para></listitem>
+ * <listitem><para>Run tests quietly.</para></listitem>
* </varlistentry>
* <varlistentry>
* <term><option>-p <replaceable>TESTPATH</replaceable></option></term>
* <listitem><para>
- * execute all tests matching <replaceable>TESTPATH</replaceable>.
+ * Execute all tests matching <replaceable>TESTPATH</replaceable>.
+ * This can also be used to force a test to run that would otherwise
+ * be skipped (ie, a test whose name contains "/subprocess").
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term><option>-m {perf|slow|thorough|quick|undefined|no-undefined}</option></term>
* <listitem><para>
- * execute tests according to these test modes:
+ * Execute tests according to these test modes:
* <variablelist>
* <varlistentry>
* <term>perf</term>
* <listitem><para>
- * performance tests, may take long and report results.
+ * Performance tests, may take long and report results.
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term>slow, thorough</term>
* <listitem><para>
- * slow and thorough tests, may take quite long and
+ * Slow and thorough tests, may take quite long and
* maximize coverage.
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term>quick</term>
* <listitem><para>
- * quick tests, should run really quickly and give good coverage.
+ * Quick tests, should run really quickly and give good coverage.
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term>undefined</term>
* <listitem><para>
- * tests for undefined behaviour, may provoke programming errors
- * under g_test_trap_fork() to check that appropriate assertions
- * or warnings are given
+ * Tests for undefined behaviour, may provoke programming errors
+ * under g_test_trap_subprocess() or g_test_expect_messages() to check
+ * that appropriate assertions or warnings are given
* </para></listitem>
* </varlistentry>
* <varlistentry>
* <term>no-undefined</term>
* <listitem><para>
- * avoid tests for undefined behaviour
+ * Avoid tests for undefined behaviour
* </para></listitem>
* </varlistentry>
* </variablelist>
@@ -902,19 +1083,7 @@ parse_args (gint *argc_p,
* </varlistentry>
* <varlistentry>
* <term><option>--debug-log</option></term>
- * <listitem><para>debug test logging output.</para></listitem>
- * </varlistentry>
- * <varlistentry>
- * <term><option>-k</option>, <option>--keep-going</option></term>
- * <listitem><para>gtester-specific argument.</para></listitem>
- * </varlistentry>
- * <varlistentry>
- * <term><option>--GTestLogFD <replaceable>N</replaceable></option></term>
- * <listitem><para>gtester-specific argument.</para></listitem>
- * </varlistentry>
- * <varlistentry>
- * <term><option>--GTestSkipCount <replaceable>N</replaceable></option></term>
- * <listitem><para>gtester-specific argument.</para></listitem>
+ * <listitem><para>Debug test logging output.</para></listitem>
* </varlistentry>
* </variablelist>
*
@@ -969,6 +1138,25 @@ g_test_init (int *argc,
/* report program start */
g_log_set_default_handler (gtest_default_log_handler, NULL);
g_test_log (G_TEST_LOG_START_BINARY, g_get_prgname(), test_run_seedstr, 0, NULL);
+
+ test_argv0_dirname = g_path_get_dirname (test_argv0);
+
+ /* Make sure we get the real dirname that the test was run from */
+ if (g_str_has_suffix (test_argv0_dirname, "/.libs"))
+ {
+ gchar *tmp;
+ tmp = g_path_get_dirname (test_argv0_dirname);
+ g_free (test_argv0_dirname);
+ test_argv0_dirname = tmp;
+ }
+
+ test_disted_files_dir = g_getenv ("G_TEST_SRCDIR");
+ if (!test_disted_files_dir)
+ test_disted_files_dir = test_argv0_dirname;
+
+ test_built_files_dir = g_getenv ("G_TEST_BUILDDIR");
+ if (!test_built_files_dir)
+ test_built_files_dir = test_argv0_dirname;
}
static void
@@ -1374,6 +1562,15 @@ g_test_create_case (const char *test_name,
return tc;
}
+static gint
+find_suite (gconstpointer l, gconstpointer s)
+{
+ const GTestSuite *suite = l;
+ const gchar *str = s;
+
+ return strcmp (suite->name, str);
+}
+
/**
* GTestFixtureFunc:
* @fixture: the test fixture
@@ -1423,8 +1620,18 @@ g_test_add_vtable (const char *testpath,
continue; /* initial or duplicate slash */
else if (!islast)
{
- GTestSuite *csuite = g_test_create_suite (seg);
- g_test_suite_add_suite (suite, csuite);
+ GSList *l;
+ GTestSuite *csuite;
+ l = g_slist_find_custom (suite->suites, seg, find_suite);
+ if (l)
+ {
+ csuite = l->data;
+ }
+ else
+ {
+ csuite = g_test_create_suite (seg);
+ g_test_suite_add_suite (suite, csuite);
+ }
suite = csuite;
}
else /* islast */
@@ -1458,7 +1665,104 @@ g_test_add_vtable (const char *testpath,
void
g_test_fail (void)
{
- test_run_success = FALSE;
+ test_run_success = G_TEST_RUN_FAILURE;
+}
+
+/**
+ * g_test_incomplete:
+ * @msg: (allow-none): explanation
+ *
+ * Indicates that a test failed because of some incomplete
+ * functionality. This function can be called multiple times
+ * from the same test.
+ *
+ * Calling this function will not stop the test from running, you
+ * need to return from the test function yourself. So you can
+ * produce additional diagnostic messages or even continue running
+ * the test.
+ *
+ * If not called from inside a test, this function does nothing.
+ *
+ * Since: 2.38
+ */
+void
+g_test_incomplete (const gchar *msg)
+{
+ test_run_success = G_TEST_RUN_INCOMPLETE;
+ g_free (test_run_msg);
+ test_run_msg = g_strdup (msg);
+}
+
+/**
+ * g_test_skip:
+ * @msg: (allow-none): explanation
+ *
+ * Indicates that a test was skipped.
+ *
+ * Calling this function will not stop the test from running, you
+ * need to return from the test function yourself. So you can
+ * produce additional diagnostic messages or even continue running
+ * the test.
+ *
+ * If not called from inside a test, this function does nothing.
+ *
+ * Since: 2.38
+ */
+void
+g_test_skip (const gchar *msg)
+{
+ test_run_success = G_TEST_RUN_SKIPPED;
+ g_free (test_run_msg);
+ test_run_msg = g_strdup (msg);
+}
+
+/**
+ * g_test_failed:
+ *
+ * Returns whether a test has already failed. This will
+ * be the case when g_test_fail(), g_test_incomplete()
+ * or g_test_skip() have been called, but also if an
+ * assertion has failed.
+ *
+ * This can be useful to return early from a test if
+ * continuing after a failed assertion might be harmful.
+ *
+ * The return value of this function is only meaningful
+ * if it is called from inside a test function.
+ *
+ * Returns: %TRUE if the test has failed
+ *
+ * Since: 2.38
+ */
+gboolean
+g_test_failed (void)
+{
+ return test_run_success != G_TEST_RUN_SUCCESS;
+}
+
+/**
+ * g_test_set_nonfatal_assertions:
+ *
+ * Changes the behaviour of g_assert_cmpstr(), g_assert_cmpint(),
+ * g_assert_cmpuint(), g_assert_cmphex(), g_assert_cmpfloat(),
+ * g_assert_true(), g_assert_false(), g_assert_null(), g_assert_no_error(),
+ * g_assert_error(), g_test_assert_expected_messages() and the various
+ * g_test_trap_assert_*() macros to not abort to program, but instead
+ * call g_test_fail() and continue.
+ *
+ * Note that the g_assert_not_reached() and g_assert() are not
+ * affected by this.
+ *
+ * This function can only be called after g_test_init().
+ *
+ * Since: 2.38
+ */
+void
+g_test_set_nonfatal_assertions (void)
+{
+ if (!g_test_config_vars->test_initialized)
+ g_error ("g_test_set_nonfatal_assertions called without g_test_init");
+ test_nonfatal_assertions = TRUE;
}
/**
@@ -1479,6 +1783,11 @@ g_test_fail (void)
* created on the fly and added to the root fixture, based on the
* slash-separated portions of @testpath.
*
+ * If @testpath includes the component "subprocess" anywhere in it,
+ * the test will be skipped by default, and only run if explicitly
+ * required via the <option>-p</option> command-line option or
+ * g_test_trap_subprocess().
+ *
* Since: 2.16
*/
void
@@ -1513,6 +1822,11 @@ g_test_add_func (const char *testpath,
* slash-separated portions of @testpath. The @test_data argument
* will be passed as first argument to @test_func.
*
+ * If @testpath includes the component "subprocess" anywhere in it,
+ * the test will be skipped by default, and only run if explicitly
+ * required via the <option>-p</option> command-line option or
+ * g_test_trap_subprocess().
+ *
* Since: 2.16
*/
void
@@ -1523,10 +1837,73 @@ g_test_add_data_func (const char *testpath,
g_return_if_fail (testpath != NULL);
g_return_if_fail (testpath[0] == '/');
g_return_if_fail (test_func != NULL);
+
g_test_add_vtable (testpath, 0, test_data, NULL, (GTestFixtureFunc) test_func, NULL);
}
/**
+ * g_test_add_data_func_full:
+ * @testpath: /-separated test case path name for the test.
+ * @test_data: Test data argument for the test function.
+ * @test_func: The test function to invoke for this test.
+ * @data_free_func: #GDestroyNotify for @test_data.
+ *
+ * Create a new test case, as with g_test_add_data_func(), but freeing
+ * @test_data after the test run is complete.
+ *
+ * Since: 2.34
+ */
+void
+g_test_add_data_func_full (const char *testpath,
+ gpointer test_data,
+ GTestDataFunc test_func,
+ GDestroyNotify data_free_func)
+{
+ g_return_if_fail (testpath != NULL);
+ g_return_if_fail (testpath[0] == '/');
+ g_return_if_fail (test_func != NULL);
+
+ g_test_add_vtable (testpath, 0, test_data, NULL,
+ (GTestFixtureFunc) test_func,
+ (GTestFixtureFunc) data_free_func);
+}
+
+static gboolean
+g_test_suite_case_exists (GTestSuite *suite,
+ const char *test_path)
+{
+ GSList *iter;
+ char *slash;
+ GTestCase *tc;
+
+ test_path++;
+ slash = strchr (test_path, '/');
+
+ if (slash)
+ {
+ for (iter = suite->suites; iter; iter = iter->next)
+ {
+ GTestSuite *child_suite = iter->data;
+
+ if (!strncmp (child_suite->name, test_path, slash - test_path))
+ if (g_test_suite_case_exists (child_suite, slash))
+ return TRUE;
+ }
+ }
+ else
+ {
+ for (iter = suite->cases; iter; iter = iter->next)
+ {
+ tc = iter->data;
+ if (!strcmp (tc->name, test_path))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
* g_test_create_suite:
* @suite_name: a name for the suite
*
@@ -1636,9 +2013,35 @@ static gboolean
test_case_run (GTestCase *tc)
{
gchar *old_name = test_run_name, *old_base = g_strdup (test_uri_base);
- gboolean success = TRUE;
+ GSList **old_free_list, *filename_free_list = NULL;
+ gboolean success = G_TEST_RUN_SUCCESS;
+
+ old_free_list = test_filename_free_list;
+ test_filename_free_list = &filename_free_list;
test_run_name = g_strconcat (old_name, "/", tc->name, NULL);
+ if (strstr (test_run_name, "/subprocess"))
+ {
+ GSList *iter;
+ gboolean found = FALSE;
+
+ for (iter = test_paths; iter; iter = iter->next)
+ {
+ if (!strcmp (test_run_name, iter->data))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ if (g_test_verbose ())
+ g_print ("GTest: skipping: %s\n", test_run_name);
+ goto out;
+ }
+ }
+
if (++test_run_count <= test_skip_count)
g_test_log (G_TEST_LOG_SKIP_CASE, test_run_name, NULL, 0, NULL);
else if (test_run_list)
@@ -1653,7 +2056,8 @@ test_case_run (GTestCase *tc)
void *fixture;
g_test_log (G_TEST_LOG_START_CASE, test_run_name, NULL, 0, NULL);
test_run_forks = 0;
- test_run_success = TRUE;
+ test_run_success = G_TEST_RUN_SUCCESS;
+ g_clear_pointer (&test_run_msg, g_free);
g_test_log_set_fatal_handler (NULL, NULL);
g_timer_start (test_run_timer);
fixture = tc->fixture_size ? g_malloc0 (tc->fixture_size) : tc->test_data;
@@ -1675,19 +2079,24 @@ test_case_run (GTestCase *tc)
g_free (fixture);
g_timer_stop (test_run_timer);
success = test_run_success;
- test_run_success = FALSE;
- largs[0] = success ? 0 : 1; /* OK */
+ test_run_success = G_TEST_RUN_FAILURE;
+ largs[0] = success; /* OK */
largs[1] = test_run_forks;
largs[2] = g_timer_elapsed (test_run_timer, NULL);
- g_test_log (G_TEST_LOG_STOP_CASE, NULL, NULL, G_N_ELEMENTS (largs), largs);
+ g_test_log (G_TEST_LOG_STOP_CASE, test_run_name, test_run_msg, G_N_ELEMENTS (largs), largs);
+ g_clear_pointer (&test_run_msg, g_free);
g_timer_destroy (test_run_timer);
}
+
+ out:
+ g_slist_free_full (filename_free_list, g_free);
+ test_filename_free_list = old_free_list;
g_free (test_run_name);
test_run_name = old_name;
g_free (test_uri_base);
test_uri_base = old_base;
- return success;
+ return success == G_TEST_RUN_SUCCESS;
}
static int
@@ -1700,6 +2109,8 @@ g_test_run_suite_internal (GTestSuite *suite,
g_return_val_if_fail (suite != NULL, -1);
+ g_test_log (G_TEST_LOG_START_SUITE, suite->name, NULL, 0, NULL);
+
while (path[0] == '/')
path++;
l = strlen (path);
@@ -1711,7 +2122,7 @@ g_test_run_suite_internal (GTestSuite *suite,
{
GTestCase *tc = slist->data;
guint n = l ? strlen (tc->name) : 0;
- if (l == n && strncmp (path, tc->name, n) == 0)
+ if (l == n && !rest && strncmp (path, tc->name, n) == 0)
{
if (!test_case_run (tc))
n_bad++;
@@ -1730,6 +2141,8 @@ g_test_run_suite_internal (GTestSuite *suite,
g_free (test_run_name);
test_run_name = old_name;
+ g_test_log (G_TEST_LOG_STOP_SUITE, suite->name, NULL, 0, NULL);
+
return n_bad;
}
@@ -1751,6 +2164,7 @@ g_test_run_suite_internal (GTestSuite *suite,
int
g_test_run_suite (GTestSuite *suite)
{
+ GSList *my_test_paths;
guint n_bad = 0;
g_return_val_if_fail (g_test_config_vars->test_initialized, -1);
@@ -1758,13 +2172,16 @@ g_test_run_suite (GTestSuite *suite)
g_test_run_once = FALSE;
- if (!test_paths)
- test_paths = g_slist_prepend (test_paths, "");
- while (test_paths)
+ if (test_paths)
+ my_test_paths = g_slist_copy (test_paths);
+ else
+ my_test_paths = g_slist_prepend (NULL, "");
+
+ while (my_test_paths)
{
- const char *rest, *path = test_paths->data;
+ const char *rest, *path = my_test_paths->data;
guint l, n = strlen (suite->name);
- test_paths = g_slist_delete_link (test_paths, test_paths);
+ my_test_paths = g_slist_delete_link (my_test_paths, my_test_paths);
while (path[0] == '/')
path++;
if (!n) /* root suite, run unconditionally */
@@ -1858,7 +2275,7 @@ g_assertion_message (const char *domain,
g_test_log (G_TEST_LOG_ERROR, s, NULL, 0, NULL);
g_free (s);
- abort();
+ _g_log_abort ();
}
void
@@ -1868,9 +2285,14 @@ g_assertion_message_expr (const char *domain,
const char *func,
const char *expr)
{
- char *s = g_strconcat ("assertion failed: (", expr, ")", NULL);
+ char *s;
+ if (!expr)
+ s = g_strdup ("code should not be reached");
+ else
+ s = g_strconcat ("assertion failed: (", expr, ")", NULL);
g_assertion_message (domain, file, line, func, s);
g_free (s);
+ abort ();
}
void
@@ -1885,11 +2307,12 @@ g_assertion_message_cmpnum (const char *domain,
char numtype)
{
char *s = NULL;
+
switch (numtype)
{
- case 'i': s = g_strdup_printf ("assertion failed (%s): (%.0Lf %s %.0Lf)", expr, arg1, cmp, arg2); break;
+ case 'i': s = g_strdup_printf ("assertion failed (%s): (%" G_GINT64_MODIFIER "i %s %" G_GINT64_MODIFIER "i)", expr, (gint64) arg1, cmp, (gint64) arg2); break;
case 'x': s = g_strdup_printf ("assertion failed (%s): (0x%08" G_GINT64_MODIFIER "x %s 0x%08" G_GINT64_MODIFIER "x)", expr, (guint64) arg1, cmp, (guint64) arg2); break;
- case 'f': s = g_strdup_printf ("assertion failed (%s): (%.9Lg %s %.9Lg)", expr, arg1, cmp, arg2); break;
+ case 'f': s = g_strdup_printf ("assertion failed (%s): (%.9g %s %.9g)", expr, (double) arg1, cmp, (double) arg2); break;
/* ideally use: floats=%.7g double=%.17g */
}
g_assertion_message (domain, file, line, func, s);
@@ -1957,11 +2380,11 @@ g_assertion_message_error (const char *domain,
* @str1: (allow-none): a C string or %NULL
* @str2: (allow-none): another C string or %NULL
*
- * Compares @str1 and @str2 like strcmp(). Handles %NULL
+ * Compares @str1 and @str2 like strcmp(). Handles %NULL
* gracefully by sorting it before non-%NULL strings.
* Comparing two %NULL pointers returns 0.
*
- * Returns: -1, 0 or 1, if @str1 is <, == or > than @str2.
+ * Returns: an integer less than, equal to, or greater than zero, if @str1 is <, == or > than @str2.
*
* Since: 2.16
*/
@@ -1976,103 +2399,14 @@ g_strcmp0 (const char *str1,
return strcmp (str1, str2);
}
-#ifdef G_OS_UNIX
-static int /* 0 on success */
-kill_child (int pid,
- int *status,
- int patience)
-{
- int wr;
- if (patience >= 3) /* try graceful reap */
- {
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- }
- if (patience >= 2) /* try SIGHUP */
- {
- kill (pid, SIGHUP);
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- g_usleep (20 * 1000); /* give it some scheduling/shutdown time */
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- g_usleep (50 * 1000); /* give it some scheduling/shutdown time */
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- g_usleep (100 * 1000); /* give it some scheduling/shutdown time */
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- }
- if (patience >= 1) /* try SIGTERM */
- {
- kill (pid, SIGTERM);
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- g_usleep (200 * 1000); /* give it some scheduling/shutdown time */
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- g_usleep (400 * 1000); /* give it some scheduling/shutdown time */
- if (waitpid (pid, status, WNOHANG) > 0)
- return 0;
- }
- /* finish it off */
- kill (pid, SIGKILL);
- do
- wr = waitpid (pid, status, 0);
- while (wr < 0 && errno == EINTR);
- return wr;
-}
-#endif
-
-static inline int
-g_string_must_read (GString *gstring,
- int fd)
-{
-#define STRING_BUFFER_SIZE 4096
- char buf[STRING_BUFFER_SIZE];
- gssize bytes;
- again:
- bytes = read (fd, buf, sizeof (buf));
- if (bytes == 0)
- return 0; /* EOF, calling this function assumes data is available */
- else if (bytes > 0)
- {
- g_string_append_len (gstring, buf, bytes);
- return 1;
- }
- else if (bytes < 0 && errno == EINTR)
- goto again;
- else /* bytes < 0 */
- {
- g_warning ("failed to read() from child process (%d): %s", test_trap_last_pid, g_strerror (errno));
- return 1; /* ignore error after warning */
- }
-}
-
-static inline void
-g_string_write_out (GString *gstring,
- int outfd,
- int *stringpos)
-{
- if (*stringpos < gstring->len)
- {
- int r;
- do
- r = write (outfd, gstring->str + *stringpos, gstring->len - *stringpos);
- while (r < 0 && errno == EINTR);
- *stringpos += MAX (r, 0);
- }
-}
-
static void
test_trap_clear (void)
{
test_trap_last_status = 0;
test_trap_last_pid = 0;
- g_free (test_trap_last_stdout);
- test_trap_last_stdout = NULL;
- g_free (test_trap_last_stderr);
- test_trap_last_stderr = NULL;
+ g_clear_pointer (&test_trap_last_subprocess, g_free);
+ g_clear_pointer (&test_trap_last_stdout, g_free);
+ g_clear_pointer (&test_trap_last_stderr, g_free);
}
#ifdef G_OS_UNIX
@@ -2088,27 +2422,191 @@ sane_dup2 (int fd1,
return ret;
}
-static guint64
-test_time_stamp (void)
+#endif
+
+typedef struct {
+ GPid pid;
+ GMainLoop *loop;
+ int child_status;
+
+ GIOChannel *stdout_io;
+ gboolean echo_stdout;
+ GString *stdout_str;
+
+ GIOChannel *stderr_io;
+ gboolean echo_stderr;
+ GString *stderr_str;
+} WaitForChildData;
+
+static void
+check_complete (WaitForChildData *data)
{
- GTimeVal tv;
- guint64 stamp;
- g_get_current_time (&tv);
- stamp = tv.tv_sec;
- stamp = stamp * 1000000 + tv.tv_usec;
- return stamp;
+ if (data->child_status != -1 && data->stdout_io == NULL && data->stderr_io == NULL)
+ g_main_loop_quit (data->loop);
}
+static void
+child_exited (GPid pid,
+ gint status,
+ gpointer user_data)
+{
+ WaitForChildData *data = user_data;
+
+#ifdef G_OS_UNIX
+ if (WIFEXITED (status)) /* normal exit */
+ data->child_status = WEXITSTATUS (status); /* 0..255 */
+ else if (WIFSIGNALED (status) && WTERMSIG (status) == SIGALRM)
+ data->child_status = G_TEST_STATUS_TIMED_OUT;
+ else if (WIFSIGNALED (status))
+ data->child_status = (WTERMSIG (status) << 12); /* signalled */
+ else /* WCOREDUMP (status) */
+ data->child_status = 512; /* coredump */
+#else
+ data->child_status = status;
+#endif
+
+ check_complete (data);
+}
+
+static gboolean
+child_timeout (gpointer user_data)
+{
+ WaitForChildData *data = user_data;
+
+#ifdef G_OS_WIN32
+ TerminateProcess (data->pid, G_TEST_STATUS_TIMED_OUT);
+#else
+ kill (data->pid, SIGALRM);
#endif
+ return FALSE;
+}
+
+static gboolean
+child_read (GIOChannel *io, GIOCondition cond, gpointer user_data)
+{
+ WaitForChildData *data = user_data;
+ GIOStatus status;
+ gsize nread, nwrote, total;
+ gchar buf[4096];
+ FILE *echo_file = NULL;
+
+ status = g_io_channel_read_chars (io, buf, sizeof (buf), &nread, NULL);
+ if (status == G_IO_STATUS_ERROR || status == G_IO_STATUS_EOF)
+ {
+ // FIXME data->error = (status == G_IO_STATUS_ERROR);
+ if (io == data->stdout_io)
+ g_clear_pointer (&data->stdout_io, g_io_channel_unref);
+ else
+ g_clear_pointer (&data->stderr_io, g_io_channel_unref);
+
+ check_complete (data);
+ return FALSE;
+ }
+ else if (status == G_IO_STATUS_AGAIN)
+ return TRUE;
+
+ if (io == data->stdout_io)
+ {
+ g_string_append_len (data->stdout_str, buf, nread);
+ if (data->echo_stdout)
+ echo_file = stdout;
+ }
+ else
+ {
+ g_string_append_len (data->stderr_str, buf, nread);
+ if (data->echo_stderr)
+ echo_file = stderr;
+ }
+
+ if (echo_file)
+ {
+ for (total = 0; total < nread; total += nwrote)
+ {
+ nwrote = fwrite (buf + total, 1, nread - total, echo_file);
+ if (nwrote == 0)
+ g_error ("write failed: %s", g_strerror (errno));
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+wait_for_child (GPid pid,
+ int stdout_fd, gboolean echo_stdout,
+ int stderr_fd, gboolean echo_stderr,
+ guint64 timeout)
+{
+ WaitForChildData data;
+ GMainContext *context;
+ GSource *source;
+
+ data.pid = pid;
+ data.child_status = -1;
+
+ context = g_main_context_new ();
+ data.loop = g_main_loop_new (context, FALSE);
+
+ source = g_child_watch_source_new (pid);
+ g_source_set_callback (source, (GSourceFunc) child_exited, &data, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+
+ data.echo_stdout = echo_stdout;
+ data.stdout_str = g_string_new (NULL);
+ data.stdout_io = g_io_channel_unix_new (stdout_fd);
+ g_io_channel_set_close_on_unref (data.stdout_io, TRUE);
+ g_io_channel_set_encoding (data.stdout_io, NULL, NULL);
+ g_io_channel_set_buffered (data.stdout_io, FALSE);
+ source = g_io_create_watch (data.stdout_io, G_IO_IN | G_IO_ERR | G_IO_HUP);
+ g_source_set_callback (source, (GSourceFunc) child_read, &data, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+
+ data.echo_stderr = echo_stderr;
+ data.stderr_str = g_string_new (NULL);
+ data.stderr_io = g_io_channel_unix_new (stderr_fd);
+ g_io_channel_set_close_on_unref (data.stderr_io, TRUE);
+ g_io_channel_set_encoding (data.stderr_io, NULL, NULL);
+ g_io_channel_set_buffered (data.stderr_io, FALSE);
+ source = g_io_create_watch (data.stderr_io, G_IO_IN | G_IO_ERR | G_IO_HUP);
+ g_source_set_callback (source, (GSourceFunc) child_read, &data, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+
+ if (timeout)
+ {
+ source = g_timeout_source_new (0);
+ g_source_set_ready_time (source, g_get_monotonic_time () + timeout);
+ g_source_set_callback (source, (GSourceFunc) child_timeout, &data, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+ }
+
+ g_main_loop_run (data.loop);
+ g_main_loop_unref (data.loop);
+ g_main_context_unref (context);
+
+ test_trap_last_pid = pid;
+ test_trap_last_status = data.child_status;
+ test_trap_last_stdout = g_string_free (data.stdout_str, FALSE);
+ test_trap_last_stderr = g_string_free (data.stderr_str, FALSE);
+
+ g_clear_pointer (&data.stdout_io, g_io_channel_unref);
+ g_clear_pointer (&data.stderr_io, g_io_channel_unref);
+}
+
/**
* g_test_trap_fork:
* @usec_timeout: Timeout for the forked test in micro seconds.
* @test_trap_flags: Flags to modify forking behaviour.
*
* Fork the current test program to execute a test case that might
- * not return or that might abort. The forked test case is aborted
- * and considered failing if its run time exceeds @usec_timeout.
+ * not return or that might abort.
+ *
+ * If @usec_timeout is non-0, the forked test case is aborted and
+ * considered failing if its run time exceeds it.
*
* The forking behavior can be configured with the #GTestTrapFlags flags.
*
@@ -2127,31 +2625,31 @@ test_time_stamp (void)
* g_printerr ("some stderr text: semagic43\n");
* exit (0); /&ast; successful test run &ast;/
* }
- * g_test_trap_assert_passed();
+ * g_test_trap_assert_passed ();
* g_test_trap_assert_stdout ("*somagic17*");
* g_test_trap_assert_stderr ("*semagic43*");
* }
* ]|
*
- * This function is implemented only on Unix platforms.
- *
* Returns: %TRUE for the forked child and %FALSE for the executing parent process.
*
* Since: 2.16
+ *
+ * Deprecated: This function is implemented only on Unix platforms,
+ * and is not always reliable due to problems inherent in
+ * fork-without-exec. Use g_test_trap_subprocess() instead.
*/
gboolean
g_test_trap_fork (guint64 usec_timeout,
GTestTrapFlags test_trap_flags)
{
#ifdef G_OS_UNIX
- gboolean pass_on_forked_log = FALSE;
int stdout_pipe[2] = { -1, -1 };
int stderr_pipe[2] = { -1, -1 };
- int stdtst_pipe[2] = { -1, -1 };
+
test_trap_clear();
- if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0)
+ if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0)
g_error ("failed to create pipes to fork test program: %s", g_strerror (errno));
- signal (SIGCHLD, SIG_DFL);
test_trap_last_pid = fork ();
if (test_trap_last_pid < 0)
g_error ("failed to fork test program: %s", g_strerror (errno));
@@ -2160,9 +2658,8 @@ g_test_trap_fork (guint64 usec_timeout,
int fd0 = -1;
close (stdout_pipe[0]);
close (stderr_pipe[0]);
- close (stdtst_pipe[0]);
if (!(test_trap_flags & G_TEST_TRAP_INHERIT_STDIN))
- fd0 = open ("/dev/null", O_RDONLY);
+ fd0 = g_open ("/dev/null", O_RDONLY, 0);
if (sane_dup2 (stdout_pipe[1], 1) < 0 || sane_dup2 (stderr_pipe[1], 2) < 0 || (fd0 >= 0 && sane_dup2 (fd0, 0) < 0))
g_error ("failed to dup2() in forked test program: %s", g_strerror (errno));
if (fd0 >= 3)
@@ -2171,109 +2668,18 @@ g_test_trap_fork (guint64 usec_timeout,
close (stdout_pipe[1]);
if (stderr_pipe[1] >= 3)
close (stderr_pipe[1]);
- test_log_fd = stdtst_pipe[1];
return TRUE;
}
else /* parent */
{
- GString *sout = g_string_new (NULL);
- GString *serr = g_string_new (NULL);
- guint64 sstamp;
- int soutpos = 0, serrpos = 0, wr, need_wait = TRUE;
test_run_forks++;
close (stdout_pipe[1]);
close (stderr_pipe[1]);
- close (stdtst_pipe[1]);
- sstamp = test_time_stamp();
- /* read data until we get EOF on all pipes */
- while (stdout_pipe[0] >= 0 || stderr_pipe[0] >= 0 || stdtst_pipe[0] > 0)
- {
- fd_set fds;
- struct timeval tv;
- int ret;
- FD_ZERO (&fds);
- if (stdout_pipe[0] >= 0)
- FD_SET (stdout_pipe[0], &fds);
- if (stderr_pipe[0] >= 0)
- FD_SET (stderr_pipe[0], &fds);
- if (stdtst_pipe[0] >= 0)
- FD_SET (stdtst_pipe[0], &fds);
- tv.tv_sec = 0;
- tv.tv_usec = MIN (usec_timeout ? usec_timeout : 1000000, 100 * 1000); /* sleep at most 0.5 seconds to catch clock skews, etc. */
- ret = select (MAX (MAX (stdout_pipe[0], stderr_pipe[0]), stdtst_pipe[0]) + 1, &fds, NULL, NULL, &tv);
- if (ret < 0 && errno != EINTR)
- {
- g_warning ("Unexpected error in select() while reading from child process (%d): %s", test_trap_last_pid, g_strerror (errno));
- break;
- }
- if (stdout_pipe[0] >= 0 && FD_ISSET (stdout_pipe[0], &fds) &&
- g_string_must_read (sout, stdout_pipe[0]) == 0)
- {
- close (stdout_pipe[0]);
- stdout_pipe[0] = -1;
- }
- if (stderr_pipe[0] >= 0 && FD_ISSET (stderr_pipe[0], &fds) &&
- g_string_must_read (serr, stderr_pipe[0]) == 0)
- {
- close (stderr_pipe[0]);
- stderr_pipe[0] = -1;
- }
- if (stdtst_pipe[0] >= 0 && FD_ISSET (stdtst_pipe[0], &fds))
- {
- guint8 buffer[4096];
- gint l, r = read (stdtst_pipe[0], buffer, sizeof (buffer));
- if (r > 0 && test_log_fd > 0)
- do
- l = write (pass_on_forked_log ? test_log_fd : -1, buffer, r);
- while (l < 0 && errno == EINTR);
- if (r == 0 || (r < 0 && errno != EINTR && errno != EAGAIN))
- {
- close (stdtst_pipe[0]);
- stdtst_pipe[0] = -1;
- }
- }
- if (!(test_trap_flags & G_TEST_TRAP_SILENCE_STDOUT))
- g_string_write_out (sout, 1, &soutpos);
- if (!(test_trap_flags & G_TEST_TRAP_SILENCE_STDERR))
- g_string_write_out (serr, 2, &serrpos);
- if (usec_timeout)
- {
- guint64 nstamp = test_time_stamp();
- int status = 0;
- sstamp = MIN (sstamp, nstamp); /* guard against backwards clock skews */
- if (usec_timeout < nstamp - sstamp)
- {
- /* timeout reached, need to abort the child now */
- kill_child (test_trap_last_pid, &status, 3);
- test_trap_last_status = 1024; /* timeout */
- if (0 && WIFSIGNALED (status))
- g_printerr ("%s: child timed out and received: %s\n", G_STRFUNC, g_strsignal (WTERMSIG (status)));
- need_wait = FALSE;
- break;
- }
- }
- }
- if (stdout_pipe[0] != -1)
- close (stdout_pipe[0]);
- if (stderr_pipe[0] != -1)
- close (stderr_pipe[0]);
- if (stdtst_pipe[0] != -1)
- close (stdtst_pipe[0]);
- if (need_wait)
- {
- int status = 0;
- do
- wr = waitpid (test_trap_last_pid, &status, 0);
- while (wr < 0 && errno == EINTR);
- if (WIFEXITED (status)) /* normal exit */
- test_trap_last_status = WEXITSTATUS (status); /* 0..255 */
- else if (WIFSIGNALED (status))
- test_trap_last_status = (WTERMSIG (status) << 12); /* signalled */
- else /* WCOREDUMP (status) */
- test_trap_last_status = 512; /* coredump */
- }
- test_trap_last_stdout = g_string_free (sout, FALSE);
- test_trap_last_stderr = g_string_free (serr, FALSE);
+
+ wait_for_child (test_trap_last_pid,
+ stdout_pipe[0], !(test_trap_flags & G_TEST_TRAP_SILENCE_STDOUT),
+ stderr_pipe[0], !(test_trap_flags & G_TEST_TRAP_SILENCE_STDERR),
+ usec_timeout);
return FALSE;
}
#else
@@ -2284,11 +2690,159 @@ g_test_trap_fork (guint64 usec_timeout,
}
/**
+ * g_test_trap_subprocess:
+ * @test_path: Test to run in a subprocess
+ * @usec_timeout: Timeout for the subprocess test in micro seconds.
+ * @test_flags: Flags to modify subprocess behaviour.
+ *
+ * Respawns the test program to run only @test_path in a subprocess.
+ * This can be used for a test case that might not return, or that
+ * might abort. @test_path will normally be the name of the parent
+ * test, followed by "<literal>/subprocess/</literal>" and then a name
+ * for the specific subtest (or just ending with
+ * "<literal>/subprocess</literal>" if the test only has one child
+ * test); tests with names of this form will automatically be skipped
+ * in the parent process.
+ *
+ * If @usec_timeout is non-0, the test subprocess is aborted and
+ * considered failing if its run time exceeds it.
+ *
+ * The subprocess behavior can be configured with the
+ * #GTestSubprocessFlags flags.
+ *
+ * You can use methods such as g_test_trap_assert_passed(),
+ * g_test_trap_assert_failed(), and g_test_trap_assert_stderr() to
+ * check the results of the subprocess. (But note that
+ * g_test_trap_assert_stdout() and g_test_trap_assert_stderr()
+ * cannot be used if @test_flags specifies that the child should
+ * inherit the parent stdout/stderr.)
+ *
+ * If your <literal>main ()</literal> needs to behave differently in
+ * the subprocess, you can call g_test_subprocess() (after calling
+ * g_test_init()) to see whether you are in a subprocess.
+ *
+ * The following example tests that calling
+ * <literal>my_object_new(1000000)</literal> will abort with an error
+ * message.
+ *
+ * |[
+ * static void
+ * test_create_large_object_subprocess (void)
+ * {
+ * my_object_new (1000000);
+ * }
+ *
+ * static void
+ * test_create_large_object (void)
+ * {
+ * g_test_trap_subprocess ("/myobject/create_large_object/subprocess", 0, 0);
+ * g_test_trap_assert_failed ();
+ * g_test_trap_assert_stderr ("*ERROR*too large*");
+ * }
+ *
+ * int
+ * main (int argc, char **argv)
+ * {
+ * g_test_init (&argc, &argv, NULL);
+ *
+ * g_test_add_func ("/myobject/create_large_object",
+ * test_create_large_object);
+ * /&ast; Because of the '/subprocess' in the name, this test will
+ * &ast; not be run by the g_test_run () call below.
+ * &ast;/
+ * g_test_add_func ("/myobject/create_large_object/subprocess",
+ * test_create_large_object_subprocess);
+ *
+ * return g_test_run ();
+ * }
+ * ]|
+ *
+ * Since: 2.38
+ */
+void
+g_test_trap_subprocess (const char *test_path,
+ guint64 usec_timeout,
+ GTestSubprocessFlags test_flags)
+{
+ GError *error = NULL;
+ GPtrArray *argv;
+ GSpawnFlags flags;
+ int stdout_fd, stderr_fd;
+ GPid pid;
+
+ /* Sanity check that they used GTestSubprocessFlags, not GTestTrapFlags */
+ g_assert ((test_flags & (G_TEST_TRAP_INHERIT_STDIN | G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) == 0);
+
+ if (!g_test_suite_case_exists (g_test_get_root (), test_path))
+ g_error ("g_test_trap_subprocess: test does not exist: %s", test_path);
+
+ if (g_test_verbose ())
+ g_print ("GTest: subprocess: %s\n", test_path);
+
+ test_trap_clear ();
+ test_trap_last_subprocess = g_strdup (test_path);
+
+ argv = g_ptr_array_new ();
+ g_ptr_array_add (argv, test_argv0);
+ g_ptr_array_add (argv, "-q");
+ g_ptr_array_add (argv, "-p");
+ g_ptr_array_add (argv, (char *)test_path);
+ g_ptr_array_add (argv, "--GTestSubprocess");
+ if (test_log_fd != -1)
+ {
+ char log_fd_buf[128];
+
+ g_ptr_array_add (argv, "--GTestLogFD");
+ g_snprintf (log_fd_buf, sizeof (log_fd_buf), "%d", test_log_fd);
+ g_ptr_array_add (argv, log_fd_buf);
+ }
+ g_ptr_array_add (argv, NULL);
+
+ flags = G_SPAWN_DO_NOT_REAP_CHILD;
+ if (test_flags & G_TEST_TRAP_INHERIT_STDIN)
+ flags |= G_SPAWN_CHILD_INHERITS_STDIN;
+
+ if (!g_spawn_async_with_pipes (test_initial_cwd,
+ (char **)argv->pdata,
+ NULL, flags,
+ NULL, NULL,
+ &pid, NULL, &stdout_fd, &stderr_fd,
+ &error))
+ {
+ g_error ("g_test_trap_subprocess() failed: %s\n",
+ error->message);
+ }
+ g_ptr_array_free (argv, TRUE);
+
+ wait_for_child (pid,
+ stdout_fd, !!(test_flags & G_TEST_SUBPROCESS_INHERIT_STDOUT),
+ stderr_fd, !!(test_flags & G_TEST_SUBPROCESS_INHERIT_STDERR),
+ usec_timeout);
+}
+
+/**
+ * g_test_subprocess:
+ *
+ * Returns %TRUE (after g_test_init() has been called) if the test
+ * program is running under g_test_trap_subprocess().
+ *
+ * Returns: %TRUE if the test program is running under
+ * g_test_trap_subprocess().
+ *
+ * Since: 2.38
+ */
+gboolean
+g_test_subprocess (void)
+{
+ return test_in_subprocess;
+}
+
+/**
* g_test_trap_has_passed:
*
- * Check the result of the last g_test_trap_fork() call.
+ * Check the result of the last g_test_trap_subprocess() call.
*
- * Returns: %TRUE if the last forked child terminated successfully.
+ * Returns: %TRUE if the last test subprocess terminated successfully.
*
* Since: 2.16
*/
@@ -2301,16 +2855,16 @@ g_test_trap_has_passed (void)
/**
* g_test_trap_reached_timeout:
*
- * Check the result of the last g_test_trap_fork() call.
+ * Check the result of the last g_test_trap_subprocess() call.
*
- * Returns: %TRUE if the last forked child got killed due to a fork timeout.
+ * Returns: %TRUE if the last test subprocess got killed due to a timeout.
*
* Since: 2.16
*/
gboolean
g_test_trap_reached_timeout (void)
{
- return 0 != (test_trap_last_status & 1024); /* timeout flag */
+ return test_trap_last_status != G_TEST_STATUS_TIMED_OUT;
}
void
@@ -2321,40 +2875,54 @@ g_test_trap_assertions (const char *domain,
guint64 assertion_flags, /* 0-pass, 1-fail, 2-outpattern, 4-errpattern */
const char *pattern)
{
-#ifdef G_OS_UNIX
gboolean must_pass = assertion_flags == 0;
gboolean must_fail = assertion_flags == 1;
gboolean match_result = 0 == (assertion_flags & 1);
const char *stdout_pattern = (assertion_flags & 2) ? pattern : NULL;
const char *stderr_pattern = (assertion_flags & 4) ? pattern : NULL;
const char *match_error = match_result ? "failed to match" : "contains invalid match";
- if (test_trap_last_pid == 0)
- g_error ("child process failed to exit after g_test_trap_fork() and before g_test_trap_assert*()");
+ char *process_id;
+
+#ifdef G_OS_UNIX
+ if (test_trap_last_subprocess != NULL)
+ {
+ process_id = g_strdup_printf ("%s [%d]", test_trap_last_subprocess,
+ test_trap_last_pid);
+ }
+ else if (test_trap_last_pid != 0)
+ process_id = g_strdup_printf ("%d", test_trap_last_pid);
+#else
+ if (test_trap_last_subprocess != NULL)
+ process_id = g_strdup (test_trap_last_subprocess);
+#endif
+ else
+ g_error ("g_test_trap_ assertion with no trapped test");
+
if (must_pass && !g_test_trap_has_passed())
{
- char *msg = g_strdup_printf ("child process (%d) of test trap failed unexpectedly", test_trap_last_pid);
+ char *msg = g_strdup_printf ("child process (%s) failed unexpectedly", process_id);
g_assertion_message (domain, file, line, func, msg);
g_free (msg);
}
if (must_fail && g_test_trap_has_passed())
{
- char *msg = g_strdup_printf ("child process (%d) did not fail as expected", test_trap_last_pid);
+ char *msg = g_strdup_printf ("child process (%s) did not fail as expected", process_id);
g_assertion_message (domain, file, line, func, msg);
g_free (msg);
}
if (stdout_pattern && match_result == !g_pattern_match_simple (stdout_pattern, test_trap_last_stdout))
{
- char *msg = g_strdup_printf ("stdout of child process (%d) %s: %s", test_trap_last_pid, match_error, stdout_pattern);
+ char *msg = g_strdup_printf ("stdout of child process (%s) %s: %s", process_id, match_error, stdout_pattern);
g_assertion_message (domain, file, line, func, msg);
g_free (msg);
}
if (stderr_pattern && match_result == !g_pattern_match_simple (stderr_pattern, test_trap_last_stderr))
{
- char *msg = g_strdup_printf ("stderr of child process (%d) %s: %s", test_trap_last_pid, match_error, stderr_pattern);
+ char *msg = g_strdup_printf ("stderr of child process (%s) %s: %s", process_id, match_error, stderr_pattern);
g_assertion_message (domain, file, line, func, msg);
g_free (msg);
}
-#endif
+ g_free (process_id);
}
static void
@@ -2551,6 +3119,184 @@ g_test_log_msg_free (GTestLogMsg *tmsg)
g_free (tmsg);
}
+static gchar *
+g_test_build_filename_va (GTestFileType file_type,
+ const gchar *first_path,
+ va_list ap)
+{
+ const gchar *pathv[16];
+ gint num_path_segments;
+
+ if (file_type == G_TEST_DIST)
+ pathv[0] = test_disted_files_dir;
+ else if (file_type == G_TEST_BUILT)
+ pathv[0] = test_built_files_dir;
+ else
+ g_assert_not_reached ();
+
+ pathv[1] = first_path;
+
+ for (num_path_segments = 2; num_path_segments < G_N_ELEMENTS (pathv); num_path_segments++)
+ {
+ pathv[num_path_segments] = va_arg (ap, const char *);
+ if (pathv[num_path_segments] == NULL)
+ break;
+ }
+
+ g_assert_cmpint (num_path_segments, <, G_N_ELEMENTS (pathv));
+
+ return g_build_filenamev ((gchar **) pathv);
+}
+
+/**
+ * g_test_build_filename:
+ * @file_type: the type of file (built vs. distributed)
+ * @first_path: the first segment of the pathname
+ * @...: %NULL-terminated additional path segments
+ *
+ * Creates the pathname to a data file that is required for a test.
+ *
+ * This function is conceptually similar to g_build_filename() except
+ * that the first argument has been replaced with a #GTestFileType
+ * argument.
+ *
+ * The data file should either have been distributed with the module
+ * containing the test (%G_TEST_DIST) or built as part of the build
+ * system of that module (%G_TEST_BUILT).
+ *
+ * In order for this function to work in srcdir != builddir situations,
+ * the G_TEST_SRCDIR and G_TEST_BUILDDIR environment variables need to
+ * have been defined. As of 2.38, this is done by the Makefile.decl
+ * included in GLib. Please ensure that your copy is up to date before
+ * using this function.
+ *
+ * In case neither variable is set, this function will fall back to
+ * using the dirname portion of argv[0], possibly removing ".libs".
+ * This allows for casual running of tests directly from the commandline
+ * in the srcdir == builddir case and should also support running of
+ * installed tests, assuming the data files have been installed in the
+ * same relative path as the test binary.
+ *
+ * Returns: the path of the file, to be freed using g_free()
+ *
+ * Since: 2.38
+ **/
+/**
+ * GTestFileType:
+ * @G_TEST_DIST: a file that was included in the distribution tarball
+ * @G_TEST_BUILT: a file that was built on the compiling machine
+ *
+ * The type of file to return the filename for, when used with
+ * g_test_build_filename().
+ *
+ * These two options correspond rather directly to the 'dist' and
+ * 'built' terminology that automake uses and are explicitly used to
+ * distinguish between the 'srcdir' and 'builddir' being separate. All
+ * files in your project should either be dist (in the
+ * <literal>DIST_EXTRA</literal> or <literal>dist_schema_DATA</literal>
+ * sense, in which case they will always be in the srcdir) or built (in
+ * the <literal>BUILT_SOURCES</literal> sense, in which case they will
+ * always be in the builddir).
+ *
+ * Note: as a general rule of automake, files that are generated only as
+ * part of the build-from-git process (but then are distributed with the
+ * tarball) always go in srcdir (even if doing a srcdir != builddir
+ * build from git) and are considered as distributed files.
+ *
+ * Since: 2.38
+ **/
+gchar *
+g_test_build_filename (GTestFileType file_type,
+ const gchar *first_path,
+ ...)
+{
+ gchar *result;
+ va_list ap;
+
+ g_assert (g_test_initialized ());
+
+ va_start (ap, first_path);
+ result = g_test_build_filename_va (file_type, first_path, ap);
+ va_end (ap);
+
+ return result;
+}
+
+/**
+ * g_test_get_dir:
+ * @file_type: the type of file (built vs. distributed)
+ *
+ * Gets the pathname of the directory containing test files of the type
+ * specified by @file_type.
+ *
+ * This is approximately the same as calling g_test_build_filename("."),
+ * but you don't need to free the return value.
+ *
+ * Returns: the path of the directory, owned by GLib
+ *
+ * Since: 2.38
+ **/
+const gchar *
+g_test_get_dir (GTestFileType file_type)
+{
+ g_assert (g_test_initialized ());
+
+ if (file_type == G_TEST_DIST)
+ return test_disted_files_dir;
+ else if (file_type == G_TEST_BUILT)
+ return test_built_files_dir;
+
+ g_assert_not_reached ();
+}
+
+/**
+ * g_test_get_filename:
+ * @file_type: the type of file (built vs. distributed)
+ * @first_path: the first segment of the pathname
+ * @...: %NULL-terminated additional path segments
+ *
+ * Gets the pathname to a data file that is required for a test.
+ *
+ * This is the same as g_test_build_filename() with two differences.
+ * The first difference is that must only use this function from within
+ * a testcase function. The second difference is that you need not free
+ * the return value -- it will be automatically freed when the testcase
+ * finishes running.
+ *
+ * It is safe to use this function from a thread inside of a testcase
+ * but you must ensure that all such uses occur before the main testcase
+ * function returns (ie: it is best to ensure that all threads have been
+ * joined).
+ *
+ * Returns: the path, automatically freed at the end of the testcase
+ *
+ * Since: 2.38
+ **/
+const gchar *
+g_test_get_filename (GTestFileType file_type,
+ const gchar *first_path,
+ ...)
+{
+ gchar *result;
+ GSList *node;
+ va_list ap;
+
+ g_assert (g_test_initialized ());
+ if (test_filename_free_list == NULL)
+ g_error ("g_test_get_filename() can only be used within testcase functions");
+
+ va_start (ap, first_path);
+ result = g_test_build_filename_va (file_type, first_path, ap);
+ va_end (ap);
+
+ node = g_slist_prepend (NULL, result);
+ do
+ node->next = *test_filename_free_list;
+ while (!g_atomic_pointer_compare_and_exchange (test_filename_free_list, node->next, node));
+
+ return result;
+}
+
/* --- macros docs START --- */
/**
* g_test_add:
diff --git a/glib/glib/gtestutils.h b/glib/glib/gtestutils.h
index 3cd173c..889df44 100644
--- a/glib/glib/gtestutils.h
+++ b/glib/glib/gtestutils.h
@@ -18,13 +18,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_TEST_UTILS_H__
+#define __G_TEST_UTILS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TEST_UTILS_H__
-#define __G_TEST_UTILS_H__
-
#include <glib/gmessages.h>
#include <glib/gstring.h>
#include <glib/gerror.h>
@@ -66,32 +66,50 @@ typedef void (*GTestFixtureFunc) (gpointer fixture,
#define g_assert_error(err, dom, c) do { if (!err || (err)->domain != dom || (err)->code != c) \
g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
#err, err, dom, c); } while (0)
+#define g_assert_true(expr) do { if G_LIKELY (expr) ; else \
+ g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+ #expr); \
+ } while (0)
+#define g_assert_false(expr) do { if G_LIKELY (!(expr)) ; else \
+ g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+ #expr); \
+ } while (0)
+#define g_assert_null(expr) do { if G_LIKELY ((expr) == NULL) ; else \
+ g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+ #expr); \
+ } while (0)
#ifdef G_DISABLE_ASSERT
#define g_assert_not_reached() do { (void) 0; } while (0)
#define g_assert(expr) do { (void) 0; } while (0)
#else /* !G_DISABLE_ASSERT */
-#define g_assert_not_reached() do { g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); } while (0)
+#define g_assert_not_reached() do { g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); } while (0)
#define g_assert(expr) do { if G_LIKELY (expr) ; else \
g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
- #expr); } while (0)
+ #expr); \
+ } while (0)
#endif /* !G_DISABLE_ASSERT */
+GLIB_AVAILABLE_IN_ALL
int g_strcmp0 (const char *str1,
const char *str2);
/* report performance results */
+GLIB_AVAILABLE_IN_ALL
void g_test_minimized_result (double minimized_quantity,
const char *format,
...) G_GNUC_PRINTF (2, 3);
+GLIB_AVAILABLE_IN_ALL
void g_test_maximized_result (double maximized_quantity,
const char *format,
...) G_GNUC_PRINTF (2, 3);
/* initialize testing framework */
+GLIB_AVAILABLE_IN_ALL
void g_test_init (int *argc,
char ***argv,
...);
/* query testing framework config */
+#define g_test_initialized() (g_test_config_vars->test_initialized)
#define g_test_quick() (g_test_config_vars->test_quick)
#define g_test_slow() (!g_test_config_vars->test_quick)
#define g_test_thorough() (!g_test_config_vars->test_quick)
@@ -99,17 +117,39 @@ void g_test_init (int *argc,
#define g_test_verbose() (g_test_config_vars->test_verbose)
#define g_test_quiet() (g_test_config_vars->test_quiet)
#define g_test_undefined() (g_test_config_vars->test_undefined)
+GLIB_AVAILABLE_IN_2_38
+gboolean g_test_subprocess (void);
+
/* run all tests under toplevel suite (path: /) */
+GLIB_AVAILABLE_IN_ALL
int g_test_run (void);
/* hook up a test functions under test path */
+GLIB_AVAILABLE_IN_ALL
void g_test_add_func (const char *testpath,
GTestFunc test_func);
+GLIB_AVAILABLE_IN_ALL
void g_test_add_data_func (const char *testpath,
gconstpointer test_data,
GTestDataFunc test_func);
+
+GLIB_AVAILABLE_IN_2_34
+void g_test_add_data_func_full (const char *testpath,
+ gpointer test_data,
+ GTestDataFunc test_func,
+ GDestroyNotify data_free_func);
+
/* tell about failure */
+GLIB_AVAILABLE_IN_2_30
void g_test_fail (void);
+GLIB_AVAILABLE_IN_2_38
+void g_test_incomplete (const gchar *msg);
+GLIB_AVAILABLE_IN_2_38
+void g_test_skip (const gchar *msg);
+GLIB_AVAILABLE_IN_2_38
+gboolean g_test_failed (void);
+GLIB_AVAILABLE_IN_2_38
+void g_test_set_nonfatal_assertions (void);
/* hook up a test with fixture under test path */
#define g_test_add(testpath, Fixture, tdata, fsetup, ftest, fteardown) \
@@ -125,30 +165,53 @@ void g_test_fail (void);
} G_STMT_END
/* add test messages to the test report */
+GLIB_AVAILABLE_IN_ALL
void g_test_message (const char *format,
...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
void g_test_bug_base (const char *uri_pattern);
+GLIB_AVAILABLE_IN_ALL
void g_test_bug (const char *bug_uri_snippet);
/* measure test timings */
+GLIB_AVAILABLE_IN_ALL
void g_test_timer_start (void);
+GLIB_AVAILABLE_IN_ALL
double g_test_timer_elapsed (void); /* elapsed seconds */
+GLIB_AVAILABLE_IN_ALL
double g_test_timer_last (void); /* repeat last elapsed() result */
/* automatically g_free or g_object_unref upon teardown */
+GLIB_AVAILABLE_IN_ALL
void g_test_queue_free (gpointer gfree_pointer);
+GLIB_AVAILABLE_IN_ALL
void g_test_queue_destroy (GDestroyNotify destroy_func,
gpointer destroy_data);
#define g_test_queue_unref(gobject) g_test_queue_destroy (g_object_unref, gobject)
-/* test traps are guards used around forked tests */
typedef enum {
G_TEST_TRAP_SILENCE_STDOUT = 1 << 7,
G_TEST_TRAP_SILENCE_STDERR = 1 << 8,
G_TEST_TRAP_INHERIT_STDIN = 1 << 9
} GTestTrapFlags;
+
+GLIB_DEPRECATED_IN_2_38_FOR (g_test_trap_subprocess)
gboolean g_test_trap_fork (guint64 usec_timeout,
GTestTrapFlags test_trap_flags);
+
+typedef enum {
+ G_TEST_SUBPROCESS_INHERIT_STDIN = 1 << 0,
+ G_TEST_SUBPROCESS_INHERIT_STDOUT = 1 << 1,
+ G_TEST_SUBPROCESS_INHERIT_STDERR = 1 << 2
+} GTestSubprocessFlags;
+
+GLIB_AVAILABLE_IN_2_38
+void g_test_trap_subprocess (const char *test_path,
+ guint64 usec_timeout,
+ GTestSubprocessFlags test_flags);
+
+GLIB_AVAILABLE_IN_ALL
gboolean g_test_trap_has_passed (void);
+GLIB_AVAILABLE_IN_ALL
gboolean g_test_trap_reached_timeout (void);
#define g_test_trap_assert_passed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 0, 0)
#define g_test_trap_assert_failed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 1, 0)
@@ -159,45 +222,59 @@ gboolean g_test_trap_reached_timeout (void);
/* provide seed-able random numbers for tests */
#define g_test_rand_bit() (0 != (g_test_rand_int() & (1 << 15)))
+GLIB_AVAILABLE_IN_ALL
gint32 g_test_rand_int (void);
+GLIB_AVAILABLE_IN_ALL
gint32 g_test_rand_int_range (gint32 begin,
gint32 end);
+GLIB_AVAILABLE_IN_ALL
double g_test_rand_double (void);
+GLIB_AVAILABLE_IN_ALL
double g_test_rand_double_range (double range_start,
double range_end);
/* semi-internal API */
+GLIB_AVAILABLE_IN_ALL
GTestCase* g_test_create_case (const char *test_name,
gsize data_size,
gconstpointer test_data,
GTestFixtureFunc data_setup,
GTestFixtureFunc data_test,
GTestFixtureFunc data_teardown);
+GLIB_AVAILABLE_IN_ALL
GTestSuite* g_test_create_suite (const char *suite_name);
+GLIB_AVAILABLE_IN_ALL
GTestSuite* g_test_get_root (void);
+GLIB_AVAILABLE_IN_ALL
void g_test_suite_add (GTestSuite *suite,
GTestCase *test_case);
+GLIB_AVAILABLE_IN_ALL
void g_test_suite_add_suite (GTestSuite *suite,
GTestSuite *nestedsuite);
+GLIB_AVAILABLE_IN_ALL
int g_test_run_suite (GTestSuite *suite);
/* internal ABI */
+GLIB_AVAILABLE_IN_ALL
void g_test_trap_assertions (const char *domain,
const char *file,
int line,
const char *func,
guint64 assertion_flags, /* 0-pass, 1-fail, 2-outpattern, 4-errpattern */
const char *pattern);
+GLIB_AVAILABLE_IN_ALL
void g_assertion_message (const char *domain,
const char *file,
int line,
const char *func,
- const char *message) G_GNUC_NORETURN;
+ const char *message);
+GLIB_AVAILABLE_IN_ALL
void g_assertion_message_expr (const char *domain,
const char *file,
int line,
const char *func,
const char *expr) G_GNUC_NORETURN;
+GLIB_AVAILABLE_IN_ALL
void g_assertion_message_cmpstr (const char *domain,
const char *file,
int line,
@@ -205,7 +282,8 @@ void g_assertion_message_cmpstr (const char *domain,
const char *expr,
const char *arg1,
const char *cmp,
- const char *arg2) G_GNUC_NORETURN;
+ const char *arg2);
+GLIB_AVAILABLE_IN_ALL
void g_assertion_message_cmpnum (const char *domain,
const char *file,
int line,
@@ -214,7 +292,8 @@ void g_assertion_message_cmpnum (const char *domain,
long double arg1,
const char *cmp,
long double arg2,
- char numtype) G_GNUC_NORETURN;
+ char numtype);
+GLIB_AVAILABLE_IN_ALL
void g_assertion_message_error (const char *domain,
const char *file,
int line,
@@ -222,7 +301,8 @@ void g_assertion_message_error (const char *domain,
const char *expr,
const GError *error,
GQuark error_domain,
- int error_code) G_GNUC_NORETURN;
+ int error_code);
+GLIB_AVAILABLE_IN_ALL
void g_test_add_vtable (const char *testpath,
gsize data_size,
gconstpointer test_data,
@@ -250,7 +330,9 @@ typedef enum {
G_TEST_LOG_STOP_CASE, /* d:status d:nforks d:elapsed */
G_TEST_LOG_MIN_RESULT, /* s:blurb d:result */
G_TEST_LOG_MAX_RESULT, /* s:blurb d:result */
- G_TEST_LOG_MESSAGE /* s:blurb */
+ G_TEST_LOG_MESSAGE, /* s:blurb */
+ G_TEST_LOG_START_SUITE,
+ G_TEST_LOG_STOP_SUITE
} GTestLogType;
typedef struct {
@@ -266,13 +348,19 @@ typedef struct {
GSList *msgs;
} GTestLogBuffer;
+GLIB_AVAILABLE_IN_ALL
const char* g_test_log_type_name (GTestLogType log_type);
+GLIB_AVAILABLE_IN_ALL
GTestLogBuffer* g_test_log_buffer_new (void);
+GLIB_AVAILABLE_IN_ALL
void g_test_log_buffer_free (GTestLogBuffer *tbuffer);
+GLIB_AVAILABLE_IN_ALL
void g_test_log_buffer_push (GTestLogBuffer *tbuffer,
guint n_bytes,
const guint8 *bytes);
+GLIB_AVAILABLE_IN_ALL
GTestLogMsg* g_test_log_buffer_pop (GTestLogBuffer *tbuffer);
+GLIB_AVAILABLE_IN_ALL
void g_test_log_msg_free (GTestLogMsg *tmsg);
/**
@@ -292,10 +380,40 @@ typedef gboolean (*GTestLogFatalFunc) (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
void
g_test_log_set_fatal_handler (GTestLogFatalFunc log_func,
gpointer user_data);
+GLIB_AVAILABLE_IN_2_34
+void g_test_expect_message (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *pattern);
+GLIB_AVAILABLE_IN_2_34
+void g_test_assert_expected_messages_internal (const char *domain,
+ const char *file,
+ int line,
+ const char *func);
+
+typedef enum
+{
+ G_TEST_DIST,
+ G_TEST_BUILT
+} GTestFileType;
+
+GLIB_AVAILABLE_IN_2_38
+gchar * g_test_build_filename (GTestFileType file_type,
+ const gchar *first_path,
+ ...) G_GNUC_NULL_TERMINATED;
+GLIB_AVAILABLE_IN_2_38
+const gchar *g_test_get_dir (GTestFileType file_type);
+GLIB_AVAILABLE_IN_2_38
+const gchar *g_test_get_filename (GTestFileType file_type,
+ const gchar *first_path,
+ ...) G_GNUC_NULL_TERMINATED;
+
+#define g_test_assert_expected_messages() g_test_assert_expected_messages_internal (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC)
+
G_END_DECLS
#endif /* __G_TEST_UTILS_H__ */
diff --git a/glib/glib/gthread-posix.c b/glib/glib/gthread-posix.c
index 3f74aa4..c7b68a0 100644
--- a/glib/glib/gthread-posix.c
+++ b/glib/glib/gthread-posix.c
@@ -66,6 +66,9 @@
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif
static void
g_thread_abort (gint status,
@@ -90,10 +93,12 @@ g_mutex_impl_new (void)
g_thread_abort (errno, "malloc");
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
- pthread_mutexattr_t attr;
- pthread_mutexattr_init (&attr);
- pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ADAPTIVE_NP);
- pattr = &attr;
+ {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init (&attr);
+ pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ADAPTIVE_NP);
+ pattr = &attr;
+ }
#endif
if G_UNLIKELY ((status = pthread_mutex_init (mutex, pattr)) != 0)
@@ -116,7 +121,7 @@ g_mutex_impl_free (pthread_mutex_t *mutex)
static pthread_mutex_t *
g_mutex_get_impl (GMutex *mutex)
{
- pthread_mutex_t *impl = mutex->p;
+ pthread_mutex_t *impl = g_atomic_pointer_get (&mutex->p);
if G_UNLIKELY (impl == NULL)
{
@@ -139,7 +144,7 @@ g_mutex_get_impl (GMutex *mutex)
* This function is useful to initialize a mutex that has been
* allocated on the stack, or as part of a larger structure.
* It is not necessary to initialize a mutex that has been
- * created that has been statically allocated.
+ * statically allocated.
*
* |[
* typedef struct {
@@ -285,7 +290,7 @@ g_rec_mutex_impl_free (pthread_mutex_t *mutex)
static pthread_mutex_t *
g_rec_mutex_get_impl (GRecMutex *rec_mutex)
{
- pthread_mutex_t *impl = rec_mutex->p;
+ pthread_mutex_t *impl = g_atomic_pointer_get (&rec_mutex->p);
if G_UNLIKELY (impl == NULL)
{
@@ -445,7 +450,7 @@ g_rw_lock_impl_free (pthread_rwlock_t *rwlock)
static pthread_rwlock_t *
g_rw_lock_get_impl (GRWLock *lock)
{
- pthread_rwlock_t *impl = lock->p;
+ pthread_rwlock_t *impl = g_atomic_pointer_get (&lock->p);
if G_UNLIKELY (impl == NULL)
{
@@ -662,7 +667,7 @@ g_cond_impl_free (pthread_cond_t *cond)
static pthread_cond_t *
g_cond_get_impl (GCond *cond)
{
- pthread_cond_t *impl = cond->p;
+ pthread_cond_t *impl = g_atomic_pointer_get (&cond->p);
if G_UNLIKELY (impl == NULL)
{
@@ -725,6 +730,8 @@ g_cond_clear (GCond *cond)
* @mutex: a #GMutex that is currently locked
*
* Atomically releases @mutex and waits until @cond is signalled.
+ * When this function returns, @mutex is locked again and owned by the
+ * calling thread.
*
* When using condition variables, it is possible that a spurious wakeup
* may occur (ie: g_cond_wait() returns even though g_cond_signal() was
@@ -852,8 +859,17 @@ g_cond_wait_until (GCond *cond,
ts.tv_sec = end_time / 1000000;
ts.tv_nsec = (end_time % 1000000) * 1000;
+#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)
+ if ((status = pthread_cond_timedwait_monotonic (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0)
+ return TRUE;
+#elif defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP)
+ if ((status = pthread_cond_timedwait_monotonic_np (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0)
+ return TRUE;
+#else
+ /* Pray that the cond is actually using the monotonic clock */
if ((status = pthread_cond_timedwait (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0)
return TRUE;
+#endif
if G_UNLIKELY (status != ETIMEDOUT)
g_thread_abort (status, "pthread_cond_timedwait");
@@ -969,7 +985,7 @@ g_private_impl_free (pthread_key_t *key)
static pthread_key_t *
g_private_get_impl (GPrivate *key)
{
- pthread_key_t *impl = key->p;
+ pthread_key_t *impl = g_atomic_pointer_get (&key->p);
if G_UNLIKELY (impl == NULL)
{
@@ -1172,8 +1188,10 @@ void
g_system_thread_set_name (const gchar *name)
{
#ifdef HAVE_SYS_PRCTL_H
+#ifdef PR_SET_NAME
prctl (PR_SET_NAME, name, 0, 0, 0, 0);
#endif
+#endif
}
/* {{{1 Epilogue */
diff --git a/glib/glib/gthread-win32.c b/glib/glib/gthread-win32.c
index 5a9ac97..c54f2bd 100644
--- a/glib/glib/gthread-win32.c
+++ b/glib/glib/gthread-win32.c
@@ -43,6 +43,7 @@
#include "config.h"
#include "glib.h"
+#include "glib-init.h"
#include "gthread.h"
#include "gthreadprivate.h"
#include "gslice.h"
@@ -982,7 +983,7 @@ g_thread_lookup_native_funcs (void)
return TRUE;
}
-G_GNUC_INTERNAL void
+void
g_thread_win32_init (void)
{
if (!g_thread_lookup_native_funcs ())
@@ -991,7 +992,7 @@ g_thread_win32_init (void)
InitializeCriticalSection (&g_private_lock);
}
-G_GNUC_INTERNAL void
+void
g_thread_win32_thread_detach (void)
{
gboolean dtors_called;
diff --git a/glib/glib/gthread.c b/glib/glib/gthread.c
index c1d06ec..c4114aa 100644
--- a/glib/glib/gthread.c
+++ b/glib/glib/gthread.c
@@ -215,10 +215,11 @@
/**
* G_TRYLOCK:
* @name: the name of the lock
- * @Returns: %TRUE, if the lock could be locked.
*
* Works like g_mutex_trylock(), but for a lock defined with
* #G_LOCK_DEFINE.
+ *
+ * Returns: %TRUE, if the lock could be locked.
*/
/**
@@ -518,11 +519,7 @@
*
* The error domain of the GLib thread subsystem.
**/
-GQuark
-g_thread_error_quark (void)
-{
- return g_quark_from_static_string ("g_thread_error");
-}
+G_DEFINE_QUARK (g_thread_error, g_thread_error)
/* Local Data {{{1 -------------------------------------------------------- */
@@ -805,7 +802,7 @@ g_thread_proxy (gpointer data)
/**
* g_thread_new:
- * @name: a name for the new thread
+ * @name: (allow-none): an (optional) name for the new thread
* @func: a function to execute in the new thread
* @data: an argument to supply to the new thread
*
@@ -816,6 +813,7 @@ g_thread_proxy (gpointer data)
* with g_thread_join().
*
* The @name can be useful for discriminating threads in a debugger.
+ * It is not used for other purposes and does not have to be unique.
* Some systems restrict the length of @name to 16 bytes.
*
* If the thread can not be created the program aborts. See
@@ -846,7 +844,7 @@ g_thread_new (const gchar *name,
/**
* g_thread_try_new:
- * @name: a name for the new thread
+ * @name: (allow-none): an (optional) name for the new thread
* @func: a function to execute in the new thread
* @data: an argument to supply to the new thread
* @error: return location for error, or %NULL
@@ -1010,5 +1008,61 @@ g_thread_self (void)
return (GThread*) thread;
}
+/**
+ * g_get_num_processors:
+ *
+ * Determine the approximate number of threads that the system will
+ * schedule simultaneously for this process. This is intended to be
+ * used as a parameter to g_thread_pool_new() for CPU bound tasks and
+ * similar cases.
+ *
+ * Returns: Number of schedulable threads, always greater than 0
+ *
+ * Since: 2.36
+ */
+guint
+g_get_num_processors (void)
+{
+#ifdef G_OS_WIN32
+ DWORD_PTR process_cpus;
+ DWORD_PTR system_cpus;
+
+ if (GetProcessAffinityMask (GetCurrentProcess (),
+ &process_cpus, &system_cpus))
+ {
+ unsigned int count;
+
+ for (count = 0; process_cpus != 0; process_cpus >>= 1)
+ if (process_cpus & 1)
+ count++;
+
+ if (count > 0)
+ return count;
+ }
+#elif defined(HAVE_UNISTD_H) && defined(_SC_NPROCESSORS_ONLN)
+ {
+ int count;
+
+ count = sysconf (_SC_NPROCESSORS_ONLN);
+ if (count > 0)
+ return count;
+ }
+#elif defined HW_NCPU
+ {
+ int mib[2], count = 0;
+ size_t len;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ len = sizeof(count);
+
+ if (sysctl (mib, 2, &count, &len, NULL, 0) == 0 && count > 0)
+ return count;
+ }
+#endif
+
+ return 1; /* Fallback */
+}
+
/* Epilogue {{{1 */
/* vim: set foldmethod=marker: */
diff --git a/glib/glib/gthread.h b/glib/glib/gthread.h
index fc927da..43c7891 100644
--- a/glib/glib/gthread.h
+++ b/glib/glib/gthread.h
@@ -24,19 +24,20 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_THREAD_H__
+#define __G_THREAD_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_THREAD_H__
-#define __G_THREAD_H__
-
#include <glib/gatomic.h>
#include <glib/gerror.h>
G_BEGIN_DECLS
#define G_THREAD_ERROR g_thread_error_quark ()
+GLIB_AVAILABLE_IN_ALL
GQuark g_thread_error_quark (void);
typedef enum
@@ -137,62 +138,100 @@ struct _GOnce
# define G_TRYLOCK(name) g_mutex_trylock (&G_LOCK_NAME (name))
#endif /* !G_DEBUG_LOCKS */
+GLIB_AVAILABLE_IN_2_32
GThread * g_thread_ref (GThread *thread);
+GLIB_AVAILABLE_IN_2_32
void g_thread_unref (GThread *thread);
+GLIB_AVAILABLE_IN_2_32
GThread * g_thread_new (const gchar *name,
GThreadFunc func,
gpointer data);
+GLIB_AVAILABLE_IN_2_32
GThread * g_thread_try_new (const gchar *name,
GThreadFunc func,
gpointer data,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GThread * g_thread_self (void);
+GLIB_AVAILABLE_IN_ALL
void g_thread_exit (gpointer retval);
+GLIB_AVAILABLE_IN_ALL
gpointer g_thread_join (GThread *thread);
+GLIB_AVAILABLE_IN_ALL
void g_thread_yield (void);
+GLIB_AVAILABLE_IN_2_32
void g_mutex_init (GMutex *mutex);
+GLIB_AVAILABLE_IN_2_32
void g_mutex_clear (GMutex *mutex);
+GLIB_AVAILABLE_IN_ALL
void g_mutex_lock (GMutex *mutex);
+GLIB_AVAILABLE_IN_ALL
gboolean g_mutex_trylock (GMutex *mutex);
+GLIB_AVAILABLE_IN_ALL
void g_mutex_unlock (GMutex *mutex);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_init (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_clear (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_writer_lock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
gboolean g_rw_lock_writer_trylock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_writer_unlock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_reader_lock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
gboolean g_rw_lock_reader_trylock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rw_lock_reader_unlock (GRWLock *rw_lock);
+GLIB_AVAILABLE_IN_2_32
void g_rec_mutex_init (GRecMutex *rec_mutex);
+GLIB_AVAILABLE_IN_2_32
void g_rec_mutex_clear (GRecMutex *rec_mutex);
+GLIB_AVAILABLE_IN_2_32
void g_rec_mutex_lock (GRecMutex *rec_mutex);
+GLIB_AVAILABLE_IN_2_32
gboolean g_rec_mutex_trylock (GRecMutex *rec_mutex);
+GLIB_AVAILABLE_IN_2_32
void g_rec_mutex_unlock (GRecMutex *rec_mutex);
+GLIB_AVAILABLE_IN_2_32
void g_cond_init (GCond *cond);
+GLIB_AVAILABLE_IN_2_32
void g_cond_clear (GCond *cond);
+GLIB_AVAILABLE_IN_ALL
void g_cond_wait (GCond *cond,
GMutex *mutex);
+GLIB_AVAILABLE_IN_ALL
void g_cond_signal (GCond *cond);
+GLIB_AVAILABLE_IN_ALL
void g_cond_broadcast (GCond *cond);
+GLIB_AVAILABLE_IN_2_32
gboolean g_cond_wait_until (GCond *cond,
GMutex *mutex,
gint64 end_time);
+GLIB_AVAILABLE_IN_ALL
gpointer g_private_get (GPrivate *key);
+GLIB_AVAILABLE_IN_ALL
void g_private_set (GPrivate *key,
gpointer value);
+GLIB_AVAILABLE_IN_2_32
void g_private_replace (GPrivate *key,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
gpointer g_once_impl (GOnce *once,
GThreadFunc func,
gpointer arg);
+GLIB_AVAILABLE_IN_ALL
gboolean g_once_init_enter (volatile void *location);
+GLIB_AVAILABLE_IN_ALL
void g_once_init_leave (volatile void *location,
gsize result);
@@ -226,6 +265,9 @@ void g_once_init_leave (volatile void *location,
(g_once_init_leave((location), (gsize) (result)))
#endif
+GLIB_AVAILABLE_IN_2_36
+guint g_get_num_processors (void);
+
G_END_DECLS
#endif /* __G_THREAD_H__ */
diff --git a/glib/glib/gthreadpool.c b/glib/glib/gthreadpool.c
index de5b9de..78684ab 100644
--- a/glib/glib/gthreadpool.c
+++ b/glib/glib/gthreadpool.c
@@ -110,9 +110,9 @@ 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 max_unused_threads = 2;
static gint kill_unused_threads = 0;
-static guint max_idle_time = 0;
+static guint max_idle_time = 15 * 1000;
static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
gpointer data);
@@ -829,6 +829,8 @@ g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool)
* 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.
+ *
+ * The default value is 2.
*/
void
g_thread_pool_set_max_unused_threads (gint max_threads)
@@ -964,8 +966,7 @@ g_thread_pool_set_sort_function (GThreadPool *pool,
*
* By setting @interval to 0, idle threads will not be stopped.
*
- * This function makes use of g_async_queue_timed_pop () using
- * @interval.
+ * The default value is 15000 (15 seconds).
*
* Since: 2.10
*/
diff --git a/glib/glib/gthreadpool.h b/glib/glib/gthreadpool.h
index 3a1f298..c05d700 100644
--- a/glib/glib/gthreadpool.h
+++ b/glib/glib/gthreadpool.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_THREADPOOL_H__
+#define __G_THREADPOOL_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_THREADPOOL_H__
-#define __G_THREADPOOL_H__
-
#include <glib/gthread.h>
G_BEGIN_DECLS
@@ -47,32 +47,46 @@ struct _GThreadPool
gboolean exclusive;
};
+GLIB_AVAILABLE_IN_ALL
GThreadPool * g_thread_pool_new (GFunc func,
gpointer user_data,
gint max_threads,
gboolean exclusive,
GError **error);
+GLIB_AVAILABLE_IN_ALL
void g_thread_pool_free (GThreadPool *pool,
gboolean immediate,
gboolean wait_);
+GLIB_AVAILABLE_IN_ALL
gboolean g_thread_pool_push (GThreadPool *pool,
gpointer data,
GError **error);
+GLIB_AVAILABLE_IN_ALL
guint g_thread_pool_unprocessed (GThreadPool *pool);
+GLIB_AVAILABLE_IN_ALL
void g_thread_pool_set_sort_function (GThreadPool *pool,
GCompareDataFunc func,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gboolean g_thread_pool_set_max_threads (GThreadPool *pool,
gint max_threads,
GError **error);
+GLIB_AVAILABLE_IN_ALL
gint g_thread_pool_get_max_threads (GThreadPool *pool);
+GLIB_AVAILABLE_IN_ALL
guint g_thread_pool_get_num_threads (GThreadPool *pool);
+GLIB_AVAILABLE_IN_ALL
void g_thread_pool_set_max_unused_threads (gint max_threads);
+GLIB_AVAILABLE_IN_ALL
gint g_thread_pool_get_max_unused_threads (void);
+GLIB_AVAILABLE_IN_ALL
guint g_thread_pool_get_num_unused_threads (void);
+GLIB_AVAILABLE_IN_ALL
void g_thread_pool_stop_unused_threads (void);
+GLIB_AVAILABLE_IN_ALL
void g_thread_pool_set_max_idle_time (guint interval);
+GLIB_AVAILABLE_IN_ALL
guint g_thread_pool_get_max_idle_time (void);
G_END_DECLS
diff --git a/glib/glib/gthreadprivate.h b/glib/glib/gthreadprivate.h
index 6b974de..15584f4 100644
--- a/glib/glib/gthreadprivate.h
+++ b/glib/glib/gthreadprivate.h
@@ -37,24 +37,18 @@ struct _GRealThread
};
/* system thread implementation (gthread-posix.c, gthread-win32.c) */
-G_GNUC_INTERNAL
void g_system_thread_wait (GRealThread *thread);
-G_GNUC_INTERNAL
GRealThread * g_system_thread_new (GThreadFunc func,
gulong stack_size,
GError **error);
-G_GNUC_INTERNAL
void g_system_thread_free (GRealThread *thread);
-G_GNUC_INTERNAL
void g_system_thread_exit (void);
-G_GNUC_INTERNAL
void g_system_thread_set_name (const gchar *name);
/* gthread.c */
-G_GNUC_INTERNAL
GThread * g_thread_new_internal (const gchar *name,
GThreadFunc proxy,
GThreadFunc func,
@@ -62,7 +56,6 @@ GThread * g_thread_new_internal (const gchar *name,
gsize stack_size,
GError **error);
-G_GNUC_INTERNAL
gpointer g_thread_proxy (gpointer thread);
#endif /* __G_THREADPRIVATE_H__ */
diff --git a/glib/glib/gtimer.c b/glib/glib/gtimer.c
index 6e962b4..a45c3cf 100644
--- a/glib/glib/gtimer.c
+++ b/glib/glib/gtimer.c
@@ -82,10 +82,11 @@ struct _GTimer
/**
* g_timer_new:
- * @Returns: a new #GTimer.
*
* Creates a new timer, and starts timing (i.e. g_timer_start() is
* implicitly called for you).
+ *
+ * Returns: a new #GTimer.
**/
GTimer*
g_timer_new (void)
@@ -204,8 +205,6 @@ g_timer_continue (GTimer *timer)
* @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.
*
* If @timer has been started but not stopped, obtains the time since
* the timer was started. If @timer has been stopped, obtains the
@@ -213,6 +212,9 @@ g_timer_continue (GTimer *timer)
* stopped. The return value is the number of seconds elapsed,
* including any fractional part. The @microseconds out parameter is
* essentially useless.
+ *
+ * Returns: seconds elapsed as a floating point value, including any
+ * fractional part.
**/
gdouble
g_timer_elapsed (GTimer *timer,
diff --git a/glib/glib/gtimer.h b/glib/glib/gtimer.h
index b927fc3..702e002 100644
--- a/glib/glib/gtimer.h
+++ b/glib/glib/gtimer.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_TIMER_H__
+#define __G_TIMER_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TIMER_H__
-#define __G_TIMER_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -43,21 +43,32 @@ typedef struct _GTimer GTimer;
#define G_USEC_PER_SEC 1000000
+GLIB_AVAILABLE_IN_ALL
GTimer* g_timer_new (void);
+GLIB_AVAILABLE_IN_ALL
void g_timer_destroy (GTimer *timer);
+GLIB_AVAILABLE_IN_ALL
void g_timer_start (GTimer *timer);
+GLIB_AVAILABLE_IN_ALL
void g_timer_stop (GTimer *timer);
+GLIB_AVAILABLE_IN_ALL
void g_timer_reset (GTimer *timer);
+GLIB_AVAILABLE_IN_ALL
void g_timer_continue (GTimer *timer);
+GLIB_AVAILABLE_IN_ALL
gdouble g_timer_elapsed (GTimer *timer,
gulong *microseconds);
+GLIB_AVAILABLE_IN_ALL
void g_usleep (gulong microseconds);
+GLIB_AVAILABLE_IN_ALL
void g_time_val_add (GTimeVal *time_,
glong microseconds);
+GLIB_AVAILABLE_IN_ALL
gboolean g_time_val_from_iso8601 (const gchar *iso_date,
GTimeVal *time_);
+GLIB_AVAILABLE_IN_ALL
gchar* g_time_val_to_iso8601 (GTimeVal *time_) G_GNUC_MALLOC;
G_END_DECLS
diff --git a/glib/glib/gtimezone.c b/glib/glib/gtimezone.c
index e513f3b..f93c825 100644
--- a/glib/glib/gtimezone.c
+++ b/glib/glib/gtimezone.c
@@ -21,6 +21,8 @@
/* Prologue {{{1 */
+#include "config.h"
+
#include "gtimezone.h"
#include <string.h>
@@ -35,6 +37,13 @@
#include "gthread.h"
#include "gbytes.h"
#include "gslice.h"
+#include "gdatetime.h"
+#include "gdate.h"
+
+#ifdef G_OS_WIN32
+#define STRICT
+#include <windows.h>
+#endif
/**
* SECTION:timezone
@@ -67,13 +76,13 @@
/**
* GTimeZone:
*
- * #GDateTime is an opaque structure whose members cannot be accessed
+ * #GTimeZone is an opaque structure whose members cannot be accessed
* directly.
*
* Since: 2.26
**/
-/* zoneinfo file format {{{1 */
+/* IANA zoneinfo file format {{{1 */
/* unaligned */
typedef struct { gchar bytes[8]; } gint64_be;
@@ -92,6 +101,7 @@ static inline guint32 guint32_from_be (const guint32_be be) {
guint32 tmp; memcpy (&tmp, &be, sizeof tmp); return GUINT32_FROM_BE (tmp);
}
+/* The layout of an IANA timezone file header */
struct tzhead
{
gchar tzh_magic[4];
@@ -113,26 +123,80 @@ struct ttinfo
guint8 tt_abbrind;
};
-/* GTimeZone structure and lifecycle {{{1 */
-struct _GTimeZone
+/* A Transition Date structure for TZ Rules, an intermediate structure
+ for parsing MSWindows and Environment-variable time zones. It
+ Generalizes MSWindows's SYSTEMTIME struct.
+ */
+typedef struct
{
- gchar *name;
-
- GBytes *zoneinfo;
+ gint year;
+ gint mon;
+ gint mday;
+ gint wday;
+ gint week;
+ gint hour;
+ gint min;
+ gint sec;
+} TimeZoneDate;
+
+/* POSIX Timezone abbreviations are typically 3 or 4 characters, but
+ Microsoft uses 32-character names. We'll use one larger to ensure
+ we have room for the terminating \0.
+ */
+#define NAME_SIZE 33
- const struct tzhead *header;
- const struct ttinfo *infos;
- const gint64_be *trans;
- const guint8 *indices;
- const gchar *abbrs;
- gint timecnt;
+/* A MSWindows-style time zone transition rule. Generalizes the
+ MSWindows TIME_ZONE_INFORMATION struct. Also used to compose time
+ zones from tzset-style identifiers.
+ */
+typedef struct
+{
+ gint start_year;
+ gint32 std_offset;
+ gint32 dlt_offset;
+ TimeZoneDate dlt_start;
+ TimeZoneDate dlt_end;
+ gchar std_name[NAME_SIZE];
+ gchar dlt_name[NAME_SIZE];
+} TimeZoneRule;
+
+/* GTimeZone's internal representation of a Daylight Savings (Summer)
+ time interval.
+ */
+typedef struct
+{
+ gint32 gmt_offset;
+ gboolean is_dst;
+ gboolean is_standard;
+ gboolean is_gmt;
+ gchar *abbrev;
+} TransitionInfo;
+
+/* GTimeZone's representation of a transition time to or from Daylight
+ Savings (Summer) time and Standard time for the zone. */
+typedef struct
+{
+ gint64 time;
+ gint info_index;
+} Transition;
+/* GTimeZone structure */
+struct _GTimeZone
+{
+ gchar *name;
+ GArray *t_info; /* Array of TransitionInfo */
+ GArray *transitions; /* Array of Transition */
gint ref_count;
};
G_LOCK_DEFINE_STATIC (time_zones);
static GHashTable/*<string?, GTimeZone>*/ *time_zones;
+#define MIN_TZYEAR 1916 /* Daylight Savings started in WWI */
+#define MAX_TZYEAR 2999 /* And it's not likely ever to go away, but
+ there's no point in getting carried
+ away. */
+
/**
* g_time_zone_unref:
* @tz: a #GTimeZone
@@ -168,9 +232,18 @@ again:
G_UNLOCK(time_zones);
}
- if (tz->zoneinfo)
- g_bytes_unref (tz->zoneinfo);
-
+ if (tz->t_info != NULL)
+ {
+ gint idx;
+ for (idx = 0; idx < tz->t_info->len; idx++)
+ {
+ TransitionInfo *info = &g_array_index (tz->t_info, TransitionInfo, idx);
+ g_free (info->abbrev);
+ }
+ g_array_free (tz->t_info, TRUE);
+ }
+ if (tz->transitions != NULL)
+ g_array_free (tz->transitions, TRUE);
g_free (tz->name);
g_slice_free (GTimeZone, tz);
@@ -204,27 +277,51 @@ g_time_zone_ref (GTimeZone *tz)
/* fake zoneinfo creation (for RFC3339/ISO 8601 timezones) {{{1 */
/*
- * parses strings of the form 'hh' 'hhmm' or 'hh:mm' where:
- * - hh is 00 to 23
+ * parses strings of the form h or hh[[:]mm[[[:]ss]]] where:
+ * - h[h] is 0 to 23
* - mm is 00 to 59
+ * - ss is 00 to 59
*/
static gboolean
parse_time (const gchar *time_,
gint32 *offset)
{
- if (*time_ < '0' || '2' < *time_)
+ if (*time_ < '0' || '9' < *time_)
return FALSE;
- *offset = 10 * 60 * 60 * (*time_++ - '0');
+ *offset = 60 * 60 * (*time_++ - '0');
- if (*time_ < '0' || '9' < *time_)
+ if (*time_ == '\0')
+ return TRUE;
+
+ if (*time_ != ':')
+ {
+ if (*time_ < '0' || '9' < *time_)
+ return FALSE;
+
+ *offset *= 10;
+ *offset += 60 * 60 * (*time_++ - '0');
+
+ if (*offset > 23 * 60 * 60)
+ return FALSE;
+
+ if (*time_ == '\0')
+ return TRUE;
+ }
+
+ if (*time_ == ':')
+ time_++;
+
+ if (*time_ < '0' || '5' < *time_)
return FALSE;
- *offset += 60 * 60 * (*time_++ - '0');
+ *offset += 10 * 60 * (*time_++ - '0');
- if (*offset > 23 * 60 * 60)
+ if (*time_ < '0' || '9' < *time_)
return FALSE;
+ *offset += 60 * (*time_++ - '0');
+
if (*time_ == '\0')
return TRUE;
@@ -234,12 +331,12 @@ parse_time (const gchar *time_,
if (*time_ < '0' || '5' < *time_)
return FALSE;
- *offset += 10 * 60 * (*time_++ - '0');
+ *offset += 10 * (*time_++ - '0');
if (*time_ < '0' || '9' < *time_)
return FALSE;
- *offset += 60 * (*time_++ - '0');
+ *offset += *time_++ - '0';
return *time_ == '\0';
}
@@ -248,6 +345,15 @@ static gboolean
parse_constant_offset (const gchar *name,
gint32 *offset)
{
+ if (g_strcmp0 (name, "UTC") == 0)
+ {
+ *offset = 0;
+ return TRUE;
+ }
+
+ if (*name >= '0' && '9' >= *name)
+ return parse_time (name, offset);
+
switch (*name++)
{
case 'Z':
@@ -269,34 +375,924 @@ parse_constant_offset (const gchar *name,
}
}
-static GBytes *
-zone_for_constant_offset (const gchar *name)
+static void
+zone_for_constant_offset (GTimeZone *gtz, const gchar *name)
{
- const gchar fake_zoneinfo_headers[] =
- "TZif" "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"
- "TZif" "2..." "...." "...." "...."
- "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\1" "\0\0\0\7";
- struct {
- struct tzhead headers[2];
- struct ttinfo info;
- gchar abbr[8];
- } *fake;
gint32 offset;
+ TransitionInfo info;
if (name == NULL || !parse_constant_offset (name, &offset))
- return NULL;
+ return;
- offset = GINT32_TO_BE (offset);
+ info.gmt_offset = offset;
+ info.is_dst = FALSE;
+ info.is_standard = TRUE;
+ info.is_gmt = TRUE;
+ info.abbrev = g_strdup (name);
- fake = g_malloc (sizeof *fake);
- memcpy (fake, fake_zoneinfo_headers, sizeof fake_zoneinfo_headers);
- memcpy (&fake->info.tt_gmtoff, &offset, sizeof offset);
- fake->info.tt_isdst = FALSE;
- fake->info.tt_abbrind = 0;
- strcpy (fake->abbr, name);
- return g_bytes_new_take (fake, sizeof *fake);
+ gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), 1);
+ g_array_append_val (gtz->t_info, info);
+
+ /* Constant offset, no transitions */
+ gtz->transitions = NULL;
+}
+
+#ifdef G_OS_UNIX
+static GBytes*
+zone_info_unix (const gchar *identifier)
+{
+ gchar *filename;
+ GMappedFile *file = NULL;
+ GBytes *zoneinfo = NULL;
+
+ /* identifier can be a relative or absolute path name;
+ if relative, it is interpreted starting from /usr/share/zoneinfo
+ while the POSIX standard says it should start with :,
+ glibc allows both syntaxes, so we should too */
+ if (identifier != NULL)
+ {
+ const gchar *tzdir;
+
+ tzdir = getenv ("TZDIR");
+ if (tzdir == NULL)
+ tzdir = "/usr/share/zoneinfo";
+
+ if (*identifier == ':')
+ identifier ++;
+
+ if (g_path_is_absolute (identifier))
+ filename = g_strdup (identifier);
+ else
+ filename = g_build_filename (tzdir, identifier, NULL);
+ }
+ else
+ filename = g_strdup ("/etc/localtime");
+
+ file = g_mapped_file_new (filename, FALSE, NULL);
+ if (file != NULL)
+ {
+ zoneinfo = g_bytes_new_with_free_func (g_mapped_file_get_contents (file),
+ g_mapped_file_get_length (file),
+ (GDestroyNotify)g_mapped_file_unref,
+ g_mapped_file_ref (file));
+ g_mapped_file_unref (file);
+ }
+ g_free (filename);
+ return zoneinfo;
+}
+
+static void
+init_zone_from_iana_info (GTimeZone *gtz, GBytes *zoneinfo)
+{
+ gsize size;
+ guint index;
+ guint32 time_count, type_count, leap_count, isgmt_count;
+ guint32 isstd_count, char_count ;
+ guint8 *tz_transitions, *tz_type_index, *tz_ttinfo;
+ guint8 *tz_leaps, *tz_isgmt, *tz_isstd;
+ guint8 *tz_abbrs;
+ gsize timesize = sizeof (gint32), countsize = sizeof (gint32);
+ const struct tzhead *header = g_bytes_get_data (zoneinfo, &size);
+
+ g_return_if_fail (size >= sizeof (struct tzhead) &&
+ memcmp (header, "TZif", 4) == 0);
+
+ if (header->tzh_version == '2')
+ {
+ /* Skip ahead to the newer 64-bit data if it's available. */
+ header = (const struct tzhead *)
+ (((const gchar *) (header + 1)) +
+ guint32_from_be(header->tzh_ttisgmtcnt) +
+ guint32_from_be(header->tzh_ttisstdcnt) +
+ 8 * guint32_from_be(header->tzh_leapcnt) +
+ 5 * guint32_from_be(header->tzh_timecnt) +
+ 6 * guint32_from_be(header->tzh_typecnt) +
+ guint32_from_be(header->tzh_charcnt));
+ timesize = sizeof (gint64);
+ }
+ time_count = guint32_from_be(header->tzh_timecnt);
+ type_count = guint32_from_be(header->tzh_typecnt);
+ leap_count = guint32_from_be(header->tzh_leapcnt);
+ isgmt_count = guint32_from_be(header->tzh_ttisgmtcnt);
+ isstd_count = guint32_from_be(header->tzh_ttisstdcnt);
+ char_count = guint32_from_be(header->tzh_charcnt);
+
+ g_assert (type_count == isgmt_count);
+ g_assert (type_count == isstd_count);
+
+ tz_transitions = ((guint8 *) (header) + sizeof (*header));
+ tz_type_index = tz_transitions + timesize * time_count;
+ tz_ttinfo = tz_type_index + time_count;
+ tz_abbrs = tz_ttinfo + sizeof (struct ttinfo) * type_count;
+ tz_leaps = tz_abbrs + char_count;
+ tz_isstd = tz_leaps + (timesize + countsize) * leap_count;
+ tz_isgmt = tz_isstd + isstd_count;
+
+ gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo),
+ type_count);
+ gtz->transitions = g_array_sized_new (FALSE, TRUE, sizeof (Transition),
+ time_count);
+
+ for (index = 0; index < type_count; index++)
+ {
+ TransitionInfo t_info;
+ struct ttinfo info = ((struct ttinfo*)tz_ttinfo)[index];
+ t_info.gmt_offset = gint32_from_be (info.tt_gmtoff);
+ t_info.is_dst = info.tt_isdst ? TRUE : FALSE;
+ t_info.is_standard = tz_isstd[index] ? TRUE : FALSE;
+ t_info.is_gmt = tz_isgmt[index] ? TRUE : FALSE;
+ t_info.abbrev = g_strdup ((gchar *) &tz_abbrs[info.tt_abbrind]);
+ g_array_append_val (gtz->t_info, t_info);
+ }
+
+ for (index = 0; index < time_count; index++)
+ {
+ Transition trans;
+ if (header->tzh_version == '2')
+ trans.time = gint64_from_be (((gint64_be*)tz_transitions)[index]);
+ else
+ trans.time = gint32_from_be (((gint32_be*)tz_transitions)[index]);
+ trans.info_index = tz_type_index[index];
+ g_assert (trans.info_index >= 0);
+ g_assert (trans.info_index < gtz->t_info->len);
+ g_array_append_val (gtz->transitions, trans);
+ }
+}
+
+#elif defined (G_OS_WIN32)
+
+static void
+copy_windows_systemtime (SYSTEMTIME *s_time, TimeZoneDate *tzdate)
+{
+ tzdate->sec = s_time->wSecond;
+ tzdate->min = s_time->wMinute;
+ tzdate->hour = s_time->wHour;
+ tzdate->mon = s_time->wMonth;
+ tzdate->year = s_time->wYear;
+ tzdate->wday = s_time->wDayOfWeek ? s_time->wDayOfWeek : 7;
+
+ if (s_time->wYear)
+ {
+ tzdate->mday = s_time->wDay;
+ tzdate->wday = 0;
+ }
+ else
+ tzdate->week = s_time->wDay;
+}
+
+/* UTC = local time + bias while local time = UTC + offset */
+static void
+rule_from_windows_time_zone_info (TimeZoneRule *rule,
+ TIME_ZONE_INFORMATION *tzi)
+{
+ /* Set offset */
+ if (tzi->StandardDate.wMonth)
+ {
+ rule->std_offset = -(tzi->Bias + tzi->StandardBias) * 60;
+ rule->dlt_offset = -(tzi->Bias + tzi->DaylightBias) * 60;
+ copy_windows_systemtime (&(tzi->DaylightDate), &(rule->dlt_start));
+
+ copy_windows_systemtime (&(tzi->StandardDate), &(rule->dlt_end));
+
+ }
+
+ else
+ {
+ rule->std_offset = -tzi->Bias * 60;
+ rule->dlt_start.mon = 0;
+ }
+ strncpy (rule->std_name, (gchar*)tzi->StandardName, NAME_SIZE - 1);
+ strncpy (rule->dlt_name, (gchar*)tzi->DaylightName, NAME_SIZE - 1);
+}
+
+static gchar*
+windows_default_tzname (void)
+{
+ const gchar *subkey =
+ "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation";
+ HKEY key;
+ gchar *key_name = NULL;
+ if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0,
+ KEY_QUERY_VALUE, &key) == ERROR_SUCCESS)
+ {
+ DWORD size = 0;
+ if (RegQueryValueExA (key, "TimeZoneKeyName", NULL, NULL,
+ NULL, &size) == ERROR_SUCCESS)
+ {
+ key_name = g_malloc ((gint)size);
+ if (RegQueryValueExA (key, "TimeZoneKeyName", NULL, NULL,
+ (LPBYTE)key_name, &size) != ERROR_SUCCESS)
+ {
+ g_free (key_name);
+ key_name = NULL;
+ }
+ }
+ RegCloseKey (key);
+ }
+ return key_name;
+}
+
+typedef struct
+{
+ LONG Bias;
+ LONG StandardBias;
+ LONG DaylightBias;
+ SYSTEMTIME StandardDate;
+ SYSTEMTIME DaylightDate;
+} RegTZI;
+
+static void
+system_time_copy (SYSTEMTIME *orig, SYSTEMTIME *target)
+{
+ g_return_if_fail (orig != NULL);
+ g_return_if_fail (target != NULL);
+
+ target->wYear = orig->wYear;
+ target->wMonth = orig->wMonth;
+ target->wDayOfWeek = orig->wDayOfWeek;
+ target->wDay = orig->wDay;
+ target->wHour = orig->wHour;
+ target->wMinute = orig->wMinute;
+ target->wSecond = orig->wSecond;
+ target->wMilliseconds = orig->wMilliseconds;
+}
+
+static void
+register_tzi_to_tzi (RegTZI *reg, TIME_ZONE_INFORMATION *tzi)
+{
+ g_return_if_fail (reg != NULL);
+ g_return_if_fail (tzi != NULL);
+ tzi->Bias = reg->Bias;
+ system_time_copy (&(reg->StandardDate), &(tzi->StandardDate));
+ tzi->StandardBias = reg->StandardBias;
+ system_time_copy (&(reg->DaylightDate), &(tzi->DaylightDate));
+ tzi->DaylightBias = reg->DaylightBias;
+}
+
+static gint
+rules_from_windows_time_zone (const gchar *identifier, TimeZoneRule **rules)
+{
+ HKEY key;
+ gchar *subkey, *subkey_dynamic;
+ gchar *key_name = NULL;
+ const gchar *reg_key =
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\";
+ TIME_ZONE_INFORMATION tzi;
+ DWORD size;
+ gint rules_num = 0;
+ RegTZI regtzi, regtzi_prev;
+
+ *rules = NULL;
+ key_name = NULL;
+
+ if (!identifier)
+ key_name = windows_default_tzname ();
+ else
+ key_name = g_strdup (identifier);
+
+ if (!key_name)
+ return 0;
+
+ subkey = g_strconcat (reg_key, key_name, NULL);
+ subkey_dynamic = g_strconcat (subkey, "\\Dynamic DST", NULL);
+
+ if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0,
+ KEY_QUERY_VALUE, &key) != ERROR_SUCCESS)
+ return 0;
+ size = sizeof tzi.StandardName;
+ if (RegQueryValueExA (key, "Std", NULL, NULL,
+ (LPBYTE)&(tzi.StandardName), &size) != ERROR_SUCCESS)
+ goto failed;
+ if (RegQueryValueExA (key, "Dlt", NULL, NULL,
+ (LPBYTE)&(tzi.DaylightName), &size) != ERROR_SUCCESS)
+ goto failed;
+
+ RegCloseKey (key);
+ if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey_dynamic, 0,
+ KEY_QUERY_VALUE, &key) == ERROR_SUCCESS)
+ {
+ DWORD first, last;
+ int year, i;
+ gchar *s;
+
+ size = sizeof first;
+ if (RegQueryValueExA (key, "FirstEntry", NULL, NULL,
+ (LPBYTE) &first, &size) != ERROR_SUCCESS)
+ goto failed;
+
+ size = sizeof last;
+ if (RegQueryValueExA (key, "LastEntry", NULL, NULL,
+ (LPBYTE) &last, &size) != ERROR_SUCCESS)
+ goto failed;
+
+ rules_num = last - first + 2;
+ *rules = g_new0 (TimeZoneRule, rules_num);
+
+ for (year = first, i = 0; year <= last; year++)
+ {
+ s = g_strdup_printf ("%d", year);
+
+ size = sizeof regtzi;
+ if (RegQueryValueExA (key, s, NULL, NULL,
+ (LPBYTE) &regtzi, &size) != ERROR_SUCCESS)
+ {
+ g_free (*rules);
+ *rules = NULL;
+ break;
+ }
+
+ g_free (s);
+
+ if (year > first && memcmp (&regtzi_prev, &regtzi, sizeof regtzi) == 0)
+ continue;
+ else
+ memcpy (&regtzi_prev, &regtzi, sizeof regtzi);
+
+ register_tzi_to_tzi (&regtzi, &tzi);
+ rule_from_windows_time_zone_info (&(*rules)[i], &tzi);
+ (*rules)[i++].start_year = year;
+ }
+
+ rules_num = i + 1;
+
+failed:
+ RegCloseKey (key);
+ }
+ else if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0,
+ KEY_QUERY_VALUE, &key) == ERROR_SUCCESS)
+ {
+ size = sizeof regtzi;
+ if (RegQueryValueExA (key, "TZI", NULL, NULL,
+ (LPBYTE) &regtzi, &size) == ERROR_SUCCESS)
+ {
+ rules_num = 2;
+ *rules = g_new0 (TimeZoneRule, 2);
+ register_tzi_to_tzi (&regtzi, &tzi);
+ rule_from_windows_time_zone_info (&(*rules)[0], &tzi);
+ }
+
+ RegCloseKey (key);
+ }
+
+ g_free (subkey_dynamic);
+ g_free (subkey);
+ g_free (key_name);
+
+ if (*rules)
+ {
+ (*rules)[0].start_year = MIN_TZYEAR;
+ if ((*rules)[rules_num - 2].start_year < MAX_TZYEAR)
+ (*rules)[rules_num - 1].start_year = MAX_TZYEAR;
+ else
+ (*rules)[rules_num - 1].start_year = (*rules)[rules_num - 2].start_year + 1;
+
+ return rules_num;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+static void
+find_relative_date (TimeZoneDate *buffer)
+{
+ gint wday;
+ GDate date;
+ g_date_clear (&date, 1);
+ wday = buffer->wday;
+
+ /* Get last day if last is needed, first day otherwise */
+ if (buffer->mon == 13 || buffer->mon == 14) /* Julian Date */
+ {
+ g_date_set_dmy (&date, 1, 1, buffer->year);
+ if (wday >= 59 && buffer->mon == 13 && g_date_is_leap_year (buffer->year))
+ g_date_add_days (&date, wday);
+ else
+ g_date_add_days (&date, wday - 1);
+ buffer->mon = (int) g_date_get_month (&date);
+ buffer->mday = (int) g_date_get_day (&date);
+ buffer->wday = 0;
+ }
+ else /* M.W.D */
+ {
+ guint days;
+ guint days_in_month = g_date_days_in_month (buffer->mon, buffer->year);
+ GDateWeekday first_wday;
+
+ g_date_set_dmy (&date, 1, buffer->mon, buffer->year);
+ first_wday = g_date_get_weekday (&date);
+
+ if (first_wday > wday)
+ ++(buffer->week);
+ /* week is 1 <= w <= 5, we need 0-based */
+ days = 7 * (buffer->week - 1) + wday - first_wday;
+
+ while (days > days_in_month)
+ days -= 7;
+
+ g_date_add_days (&date, days);
+
+ buffer->mday = g_date_get_day (&date);
+ }
+}
+
+/* Offset is previous offset of local time. Returns 0 if month is 0 */
+static gint64
+boundary_for_year (TimeZoneDate *boundary,
+ gint year,
+ gint32 offset)
+{
+ TimeZoneDate buffer;
+ GDate date;
+ const guint64 unix_epoch_start = 719163L;
+ const guint64 seconds_per_day = 86400L;
+
+ if (!boundary->mon)
+ return 0;
+ buffer = *boundary;
+
+ if (boundary->year == 0)
+ {
+ buffer.year = year;
+
+ if (buffer.wday)
+ find_relative_date (&buffer);
+ }
+
+ g_assert (buffer.year == year);
+ g_date_clear (&date, 1);
+ g_date_set_dmy (&date, buffer.mday, buffer.mon, buffer.year);
+ return ((g_date_get_julian (&date) - unix_epoch_start) * seconds_per_day +
+ buffer.hour * 3600 + buffer.min * 60 + buffer.sec - offset);
+}
+
+static void
+fill_transition_info_from_rule (TransitionInfo *info,
+ TimeZoneRule *rule,
+ gboolean is_dst)
+{
+ gint offset = is_dst ? rule->dlt_offset : rule->std_offset;
+ gchar *name = is_dst ? rule->dlt_name : rule->std_name;
+
+ info->gmt_offset = offset;
+ info->is_dst = is_dst;
+ info->is_standard = FALSE;
+ info->is_gmt = FALSE;
+
+ if (name)
+ info->abbrev = g_strdup (name);
+
+ else
+ info->abbrev = g_strdup_printf ("%+03d%02d",
+ (int) offset / 3600,
+ (int) abs (offset / 60) % 60);
+}
+
+static void
+init_zone_from_rules (GTimeZone *gtz,
+ TimeZoneRule *rules,
+ gint rules_num)
+{
+ guint type_count = 0, trans_count = 0, info_index = 0;
+ guint ri; /* rule index */
+ gboolean skip_first_std_trans = TRUE;
+ gint32 last_offset;
+
+ type_count = 0;
+ trans_count = 0;
+
+ /* Last rule only contains max year */
+ for (ri = 0; ri < rules_num - 1; ri++)
+ {
+ if (rules[ri].dlt_start.mon || rules[ri].dlt_end.mon)
+ {
+ guint rulespan = (rules[ri + 1].start_year - rules[ri].start_year);
+ guint transitions = rules[ri].dlt_start.mon > 0 ? 1 : 0;
+ transitions += rules[ri].dlt_end.mon > 0 ? 1 : 0;
+ type_count += rules[ri].dlt_start.mon > 0 ? 2 : 1;
+ trans_count += transitions * rulespan;
+ }
+ else
+ type_count++;
+ }
+
+ gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), type_count);
+ gtz->transitions = g_array_sized_new (FALSE, TRUE, sizeof (Transition), trans_count);
+
+ last_offset = rules[0].std_offset;
+
+ for (ri = 0; ri < rules_num - 1; ri++)
+ {
+ if ((rules[ri].std_offset || rules[ri].dlt_offset) &&
+ rules[ri].dlt_start.mon == 0 && rules[ri].dlt_end.mon == 0)
+ {
+ TransitionInfo std_info;
+ /* Standard */
+ fill_transition_info_from_rule (&std_info, &(rules[ri]), FALSE);
+ g_array_append_val (gtz->t_info, std_info);
+
+ if (ri > 0 &&
+ ((rules[ri - 1].dlt_start.mon > 12 &&
+ rules[ri - 1].dlt_start.wday > rules[ri - 1].dlt_end.wday) ||
+ rules[ri - 1].dlt_start.mon > rules[ri - 1].dlt_end.mon))
+ {
+ /* The previous rule was a southern hemisphere rule that
+ starts the year with DST, so we need to add a
+ transition to return to standard time */
+ guint year = rules[ri].start_year;
+ gint64 std_time = boundary_for_year (&rules[ri].dlt_end,
+ year, last_offset);
+ Transition std_trans = {std_time, info_index};
+ g_array_append_val (gtz->transitions, std_trans);
+
+ }
+ last_offset = rules[ri].std_offset;
+ ++info_index;
+ skip_first_std_trans = TRUE;
+ }
+ else if (rules[ri].std_offset || rules[ri].dlt_offset)
+ {
+ const guint start_year = rules[ri].start_year;
+ const guint end_year = rules[ri + 1].start_year;
+ gboolean dlt_first;
+ guint year;
+ TransitionInfo std_info, dlt_info;
+ if (rules[ri].dlt_start.mon > 12)
+ dlt_first = rules[ri].dlt_start.wday > rules[ri].dlt_end.wday;
+ else
+ dlt_first = rules[ri].dlt_start.mon > rules[ri].dlt_end.mon;
+ /* Standard rules are always even, because before the first
+ transition is always standard time, and 0 is even. */
+ fill_transition_info_from_rule (&std_info, &(rules[ri]), FALSE);
+ fill_transition_info_from_rule (&dlt_info, &(rules[ri]), TRUE);
+
+ g_array_append_val (gtz->t_info, std_info);
+ g_array_append_val (gtz->t_info, dlt_info);
+
+ /* Transition dates. We hope that a year which ends daylight
+ time in a southern-hemisphere country (i.e., one that
+ begins the year in daylight time) will include a rule
+ which has only a dlt_end. */
+ for (year = start_year; year < end_year; year++)
+ {
+ gint32 dlt_offset = (dlt_first ? last_offset :
+ rules[ri].dlt_offset);
+ gint32 std_offset = (dlt_first ? rules[ri].std_offset :
+ last_offset);
+ /* NB: boundary_for_year returns 0 if mon == 0 */
+ gint64 std_time = boundary_for_year (&rules[ri].dlt_end,
+ year, dlt_offset);
+ gint64 dlt_time = boundary_for_year (&rules[ri].dlt_start,
+ year, std_offset);
+ Transition std_trans = {std_time, info_index};
+ Transition dlt_trans = {dlt_time, info_index + 1};
+ last_offset = (dlt_first ? rules[ri].dlt_offset :
+ rules[ri].std_offset);
+ if (dlt_first)
+ {
+ if (skip_first_std_trans)
+ skip_first_std_trans = FALSE;
+ else if (std_time)
+ g_array_append_val (gtz->transitions, std_trans);
+ if (dlt_time)
+ g_array_append_val (gtz->transitions, dlt_trans);
+ }
+ else
+ {
+ if (dlt_time)
+ g_array_append_val (gtz->transitions, dlt_trans);
+ if (std_time)
+ g_array_append_val (gtz->transitions, std_trans);
+ }
+ }
+
+ info_index += 2;
+ }
+ }
+ if (ri > 0 &&
+ ((rules[ri - 1].dlt_start.mon > 12 &&
+ rules[ri - 1].dlt_start.wday > rules[ri - 1].dlt_end.wday) ||
+ rules[ri - 1].dlt_start.mon > rules[ri - 1].dlt_end.mon))
+ {
+ /* The previous rule was a southern hemisphere rule that
+ starts the year with DST, so we need to add a
+ transition to return to standard time */
+ TransitionInfo info;
+ guint year = rules[ri].start_year;
+ Transition trans;
+ fill_transition_info_from_rule (&info, &(rules[ri - 1]), FALSE);
+ g_array_append_val (gtz->t_info, info);
+ trans.time = boundary_for_year (&rules[ri - 1].dlt_end,
+ year, last_offset);
+ trans.info_index = info_index;
+ g_array_append_val (gtz->transitions, trans);
+ }
+}
+
+/*
+ * parses date[/time] for parsing TZ environment variable
+ *
+ * date is either Mm.w.d, Jn or N
+ * - m is 1 to 12
+ * - w is 1 to 5
+ * - d is 0 to 6
+ * - n is 1 to 365
+ * - N is 0 to 365
+ *
+ * time is either h or hh[[:]mm[[[:]ss]]]
+ * - h[h] is 0 to 23
+ * - mm is 00 to 59
+ * - ss is 00 to 59
+ */
+static gboolean
+parse_mwd_boundary (gchar **pos, TimeZoneDate *boundary)
+{
+ gint month, week, day;
+
+ if (**pos == '\0' || **pos < '0' || '9' < **pos)
+ return FALSE;
+
+ month = *(*pos)++ - '0';
+
+ if ((month == 1 && **pos >= '0' && '2' >= **pos) ||
+ (month == 0 && **pos >= '0' && '9' >= **pos))
+ {
+ month *= 10;
+ month += *(*pos)++ - '0';
+ }
+
+ if (*(*pos)++ != '.' || month == 0)
+ return FALSE;
+
+ if (**pos == '\0' || **pos < '1' || '5' < **pos)
+ return FALSE;
+
+ week = *(*pos)++ - '0';
+
+ if (*(*pos)++ != '.')
+ return FALSE;
+
+ if (**pos == '\0' || **pos < '0' || '6' < **pos)
+ return FALSE;
+
+ day = *(*pos)++ - '0';
+
+ if (!day)
+ day += 7;
+
+ boundary->year = 0;
+ boundary->mon = month;
+ boundary->week = week;
+ boundary->wday = day;
+ return TRUE;
+}
+
+/* Different implementations of tzset interpret the Julian day field
+ differently. For example, Linux specifies that it should be 1-based
+ (1 Jan is JD 1) for both Jn and n formats, while zOS and BSD
+ specify that a Jn JD is 1-based while an n JD is 0-based. Rather
+ than trying to follow different specs, we will follow GDate's
+ practice thatIn order to keep it simple, we will follow Linux's
+ practice. */
+
+static gboolean
+parse_julian_boundary (gchar** pos, TimeZoneDate *boundary,
+ gboolean ignore_leap)
+{
+ gint day = 0;
+ GDate date;
+
+ while (**pos >= '0' && '9' >= **pos)
+ {
+ day *= 10;
+ day += *(*pos)++ - '0';
+ }
+
+ if (day < 1 || 365 < day)
+ return FALSE;
+
+ g_date_clear (&date, 1);
+ g_date_set_julian (&date, day);
+ boundary->year = 0;
+ boundary->mon = (int) g_date_get_month (&date);
+ boundary->mday = (int) g_date_get_day (&date);
+ boundary->wday = 0;
+
+ if (!ignore_leap && day >= 59)
+ boundary->mday++;
+
+ return TRUE;
+}
+
+static gboolean
+parse_tz_boundary (const gchar *identifier,
+ TimeZoneDate *boundary)
+{
+ gchar *pos;
+
+ pos = (gchar*)identifier;
+ /* Month-week-weekday */
+ if (*pos == 'M')
+ {
+ ++pos;
+ if (!parse_mwd_boundary (&pos, boundary))
+ return FALSE;
+ }
+ /* Julian date which ignores Feb 29 in leap years */
+ else if (*pos == 'J')
+ {
+ ++pos;
+ if (!parse_julian_boundary (&pos, boundary, FALSE))
+ return FALSE ;
+ }
+ /* Julian date which counts Feb 29 in leap years */
+ else if (*pos >= '0' && '9' >= *pos)
+ {
+ if (!parse_julian_boundary (&pos, boundary, TRUE))
+ return FALSE;
+ }
+ else
+ return FALSE;
+
+ /* Time */
+
+ if (*pos == '/')
+ {
+ gint32 offset;
+
+ if (!parse_time (++pos, &offset))
+ return FALSE;
+
+ boundary->hour = offset / 3600;
+ boundary->min = (offset / 60) % 60;
+ boundary->sec = offset % 3600;
+
+ return TRUE;
+ }
+
+ else
+ {
+ boundary->hour = 2;
+ boundary->min = 0;
+ boundary->sec = 0;
+
+ return *pos == '\0';
+ }
+}
+
+static gint
+create_ruleset_from_rule (TimeZoneRule **rules, TimeZoneRule *rule)
+{
+ *rules = g_new0 (TimeZoneRule, 2);
+
+ (*rules)[0].start_year = MIN_TZYEAR;
+ (*rules)[1].start_year = MAX_TZYEAR;
+
+ (*rules)[0].std_offset = -rule->std_offset;
+ (*rules)[0].dlt_offset = -rule->dlt_offset;
+ (*rules)[0].dlt_start = rule->dlt_start;
+ (*rules)[0].dlt_end = rule->dlt_end;
+ strcpy ((*rules)[0].std_name, rule->std_name);
+ strcpy ((*rules)[0].dlt_name, rule->dlt_name);
+ return 2;
+}
+
+static gboolean
+parse_offset (gchar **pos, gint32 *target)
+{
+ gchar *buffer;
+ gchar *target_pos = *pos;
+ gboolean ret;
+
+ while (**pos == '+' || **pos == '-' || **pos == ':' ||
+ (**pos >= '0' && '9' >= **pos))
+ ++(*pos);
+
+ buffer = g_strndup (target_pos, *pos - target_pos);
+ ret = parse_constant_offset (buffer, target);
+ g_free (buffer);
+
+ return ret;
+}
+
+static gboolean
+parse_identifier_boundary (gchar **pos, TimeZoneDate *target)
+{
+ gchar *buffer;
+ gchar *target_pos = *pos;
+ gboolean ret;
+
+ while (**pos != ',' && **pos != '\0')
+ ++(*pos);
+ buffer = g_strndup (target_pos, *pos - target_pos);
+ ret = parse_tz_boundary (buffer, target);
+ g_free (buffer);
+
+ return ret;
+}
+
+static gboolean
+set_tz_name (gchar **pos, gchar *buffer, guint size)
+{
+ gchar *name_pos = *pos;
+ guint len;
+
+ /* Name is ASCII alpha (Is this necessarily true?) */
+ while (g_ascii_isalpha (**pos))
+ ++(*pos);
+
+ /* Name should be three or more alphabetic characters */
+ if (*pos - name_pos < 3)
+ return FALSE;
+
+ memset (buffer, 0, NAME_SIZE);
+ /* name_pos isn't 0-terminated, so we have to limit the length expressly */
+ len = *pos - name_pos > size - 1 ? size - 1 : *pos - name_pos;
+ strncpy (buffer, name_pos, len);
+ return TRUE;
+}
+
+static gboolean
+parse_identifier_boundaries (gchar **pos, TimeZoneRule *tzr)
+{
+ if (*(*pos)++ != ',')
+ return FALSE;
+
+ /* Start date */
+ if (!parse_identifier_boundary (pos, &(tzr->dlt_start)) || *(*pos)++ != ',')
+ return FALSE;
+
+ /* End date */
+ if (!parse_identifier_boundary (pos, &(tzr->dlt_end)))
+ return FALSE;
+ return TRUE;
+}
+
+/*
+ * Creates an array of TimeZoneRule from a TZ environment variable
+ * type of identifier. Should free rules afterwards
+ */
+static gint
+rules_from_identifier (const gchar *identifier,
+ TimeZoneRule **rules)
+{
+ gchar *pos;
+ TimeZoneRule tzr;
+
+ if (!identifier)
+ return 0;
+
+ pos = (gchar*)identifier;
+ memset (&tzr, 0, sizeof (tzr));
+ /* Standard offset */
+ if (!(set_tz_name (&pos, tzr.std_name, NAME_SIZE)) ||
+ !parse_offset (&pos, &(tzr.std_offset)))
+ return 0;
+
+ if (*pos == 0)
+ return create_ruleset_from_rule (rules, &tzr);
+
+ /* Format 2 */
+ if (!(set_tz_name (&pos, tzr.dlt_name, NAME_SIZE)))
+ return 0;
+ parse_offset (&pos, &(tzr.dlt_offset));
+ if (tzr.dlt_offset == 0) /* No daylight offset given, assume it's 1
+ hour earlier that standard */
+ tzr.dlt_offset = tzr.std_offset - 3600;
+ if (*pos == '\0')
+#ifdef G_OS_WIN32
+ /* Windows allows us to use the US DST boundaries if they're not given */
+ {
+ int i;
+ guint rules_num = 0;
+
+ /* Use US rules, Windows' default is Pacific Standard Time */
+ if ((rules_num = rules_from_windows_time_zone ("Pacific Standard Time",
+ rules)))
+ {
+ for (i = 0; i < rules_num - 1; i++)
+ {
+ (*rules)[i].std_offset = - tzr.std_offset;
+ (*rules)[i].dlt_offset = - tzr.dlt_offset;
+ strcpy ((*rules)[i].std_name, tzr.std_name);
+ strcpy ((*rules)[i].dlt_name, tzr.dlt_name);
+ }
+
+ return rules_num;
+ }
+ else
+ return 0;
+ }
+#else
+ return 0;
+#endif
+ /* Start and end required (format 2) */
+ if (!parse_identifier_boundaries (&pos, &tzr))
+ return 0;
+
+ return create_ruleset_from_rule (rules, &tzr);
}
/* Construction {{{1 */
@@ -310,20 +1306,50 @@ zone_for_constant_offset (const gchar *name)
* something that would pass as a valid value for the
* <varname>TZ</varname> environment variable (including %NULL).
*
+ * In Windows, @identifier can also be the unlocalized name of a time
+ * zone for standard time, for example "Pacific Standard Time".
+ *
* Valid RFC3339 time offsets are <literal>"Z"</literal> (for UTC) or
* <literal>"±hh:mm"</literal>. ISO 8601 additionally specifies
- * <literal>"±hhmm"</literal> and <literal>"±hh"</literal>.
+ * <literal>"±hhmm"</literal> and <literal>"±hh"</literal>. Offsets are
+ * time values to be added to Coordinated Universal Time (UTC) to get
+ * the local time.
+ *
+ * In Unix, the <varname>TZ</varname> environment variable typically
+ * corresponds to the name of a file in the zoneinfo database, or
+ * string in "std offset [dst [offset],start[/time],end[/time]]"
+ * (POSIX) format. There are no spaces in the specification. The
+ * name of standard and daylight savings time zone must be three or more
+ * alphabetic characters. Offsets are time values to be added to local
+ * time to get Coordinated Universal Time (UTC) and should be
+ * <literal>"[±]hh[[:]mm[:ss]]"</literal>. Dates are either
+ * <literal>"Jn"</literal> (Julian day with n between 1 and 365, leap
+ * years not counted), <literal>"n"</literal> (zero-based Julian day
+ * with n between 0 and 365) or <literal>"Mm.w.d"</literal> (day d
+ * (0 <= d <= 6) of week w (1 <= w <= 5) of month m (1 <= m <= 12), day
+ * 0 is a Sunday). Times are in local wall clock time, the default is
+ * 02:00:00.
*
- * The <varname>TZ</varname> environment variable typically corresponds
- * to the name of a file in the zoneinfo database, but there are many
- * other possibilities. Note that those other possibilities are not
- * currently implemented, but are planned.
+ * In Windows, the "tzn[+|–]hh[:mm[:ss]][dzn]" format is used, but also
+ * accepts POSIX format. The Windows format uses US rules for all time
+ * zones; daylight savings time is 60 minutes behind the standard time
+ * with date and time of change taken from Pacific Standard Time.
+ * Offsets are time values to be added to the local time to get
+ * Coordinated Universal Time (UTC).
*
* g_time_zone_new_local() calls this function with the value of the
* <varname>TZ</varname> environment variable. This function itself is
* independent of the value of <varname>TZ</varname>, but if @identifier
* is %NULL then <filename>/etc/localtime</filename> will be consulted
- * to discover the correct timezone.
+ * to discover the correct time zone on Unix and the registry will be
+ * consulted or GetTimeZoneInformation() will be used to get the local
+ * time zone on Windows.
+ *
+ * If intervals are not available, only time zone rules from
+ * <varname>TZ</varname> environment variable or other means, then they
+ * will be computed from year 1900 to 2037. If the maximum year for the
+ * rules is available and it is greater than 2037, then it will followed
+ * instead.
*
* See <ulink
* url='http://tools.ietf.org/html/rfc3339#section-5.6'>RFC3339
@@ -332,7 +1358,10 @@ zone_for_constant_offset (const gchar *name)
* full list of valid time offsets. See <ulink
* url='http://www.gnu.org/s/libc/manual/html_node/TZ-Variable.html'>The
* GNU C Library manual</ulink> for an explanation of the possible
- * values of the <varname>TZ</varname> environment variable.
+ * values of the <varname>TZ</varname> environment variable. See <ulink
+ * url='http://msdn.microsoft.com/en-us/library/ms912391%28v=winembedded.11%29.aspx'>
+ * Microsoft Time Zone Index Values</ulink> for the list of time zones
+ * on Windows.
*
* You should release the return value by calling g_time_zone_unref()
* when you are done with it.
@@ -344,99 +1373,87 @@ zone_for_constant_offset (const gchar *name)
GTimeZone *
g_time_zone_new (const gchar *identifier)
{
- GTimeZone *tz;
- GMappedFile *file;
+ GTimeZone *tz = NULL;
+ TimeZoneRule *rules;
+ gint rules_num;
G_LOCK (time_zones);
if (time_zones == NULL)
time_zones = g_hash_table_new (g_str_hash, g_str_equal);
if (identifier)
- tz = g_hash_table_lookup (time_zones, identifier);
- else
- tz = NULL;
+ {
+ tz = g_hash_table_lookup (time_zones, identifier);
+ if (tz)
+ {
+ g_atomic_int_inc (&tz->ref_count);
+ G_UNLOCK (time_zones);
+ return tz;
+ }
+ }
- if (tz == NULL)
+ tz = g_slice_new0 (GTimeZone);
+ tz->name = g_strdup (identifier);
+ tz->ref_count = 0;
+
+ zone_for_constant_offset (tz, identifier);
+
+ if (tz->t_info == NULL &&
+ (rules_num = rules_from_identifier (identifier, &rules)))
{
- tz = g_slice_new0 (GTimeZone);
- tz->name = g_strdup (identifier);
- tz->ref_count = 0;
+ init_zone_from_rules (tz, rules, rules_num);
+ g_free (rules);
+ }
- tz->zoneinfo = zone_for_constant_offset (identifier);
+ if (tz->t_info == NULL)
+ {
+#ifdef G_OS_UNIX
+ GBytes *zoneinfo = zone_info_unix (identifier);
+ if (!zoneinfo)
+ zone_for_constant_offset (tz, "UTC");
+ else
+ {
+ init_zone_from_iana_info (tz, zoneinfo);
+ g_bytes_unref (zoneinfo);
+ }
+#elif defined (G_OS_WIN32)
+ if ((rules_num = rules_from_windows_time_zone (identifier, &rules)))
+ {
+ init_zone_from_rules (tz, rules, rules_num);
+ g_free (rules);
+ }
+ }
- if (tz->zoneinfo == NULL)
+ if (tz->t_info == NULL)
+ {
+ if (identifier)
+ zone_for_constant_offset (tz, "UTC");
+ else
{
- gchar *filename;
+ TIME_ZONE_INFORMATION tzi;
- /* identifier can be a relative or absolute path name;
- if relative, it is interpreted starting from /usr/share/timezone
- while the POSIX standard says it should start with :,
- glibc allows both syntaxes, so we should too */
- if (identifier != NULL)
+ if (GetTimeZoneInformation (&tzi) != TIME_ZONE_ID_INVALID)
{
- const gchar *tzdir;
+ rules = g_new0 (TimeZoneRule, 2);
- tzdir = getenv ("TZDIR");
- if (tzdir == NULL)
- tzdir = "/usr/share/zoneinfo";
+ rule_from_windows_time_zone_info (&rules[0], &tzi);
- if (*identifier == ':')
- identifier ++;
+ memset (rules[0].std_name, 0, NAME_SIZE);
+ memset (rules[0].dlt_name, 0, NAME_SIZE);
- if (g_path_is_absolute (identifier))
- filename = g_strdup (identifier);
- else
- filename = g_build_filename (tzdir, identifier, NULL);
- }
- else
- filename = g_strdup ("/etc/localtime");
+ rules[0].start_year = MIN_TZYEAR;
+ rules[1].start_year = MAX_TZYEAR;
- file = g_mapped_file_new (filename, FALSE, NULL);
- if (file != NULL)
- {
- tz->zoneinfo = g_bytes_new_with_free_func (g_mapped_file_get_contents (file),
- g_mapped_file_get_length (file),
- (GDestroyNotify)g_mapped_file_unref,
- g_mapped_file_ref (file));
- g_mapped_file_unref (file);
- }
- g_free (filename);
- }
+ init_zone_from_rules (tz, rules, 2);
- if (tz->zoneinfo != NULL)
- {
- gsize size;
- const struct tzhead *header = g_bytes_get_data (tz->zoneinfo, &size);
-
- /* we only bother to support version 2 */
- if (size < sizeof (struct tzhead) || memcmp (header, "TZif2", 5))
- {
- g_bytes_unref (tz->zoneinfo);
- tz->zoneinfo = NULL;
- }
- else
- {
- gint typecnt;
-
- /* we trust the file completely. */
- tz->header = (const struct tzhead *)
- (((const gchar *) (header + 1)) +
- guint32_from_be(header->tzh_ttisgmtcnt) +
- guint32_from_be(header->tzh_ttisstdcnt) +
- 8 * guint32_from_be(header->tzh_leapcnt) +
- 5 * guint32_from_be(header->tzh_timecnt) +
- 6 * guint32_from_be(header->tzh_typecnt) +
- guint32_from_be(header->tzh_charcnt));
-
- typecnt = guint32_from_be (tz->header->tzh_typecnt);
- tz->timecnt = guint32_from_be (tz->header->tzh_timecnt);
- tz->trans = (gconstpointer) (tz->header + 1);
- tz->indices = (gconstpointer) (tz->trans + tz->timecnt);
- tz->infos = (gconstpointer) (tz->indices + tz->timecnt);
- tz->abbrs = (gconstpointer) (tz->infos + typecnt);
+ g_free (rules);
}
}
+#endif
+ }
+ if (tz->t_info != NULL)
+ {
if (identifier)
g_hash_table_insert (time_zones, tz->name, tz);
}
@@ -491,61 +1508,103 @@ g_time_zone_new_local (void)
return g_time_zone_new (getenv ("TZ"));
}
+#define TRANSITION(n) g_array_index (tz->transitions, Transition, n)
+#define TRANSITION_INFO(n) g_array_index (tz->t_info, TransitionInfo, n)
+
/* Internal helpers {{{1 */
-inline static const struct ttinfo *
+/* NB: Interval 0 is before the first transition, so there's no
+ * transition structure to point to which TransitionInfo to
+ * use. Rule-based zones are set up so that TI 0 is always standard
+ * time (which is what's in effect before Daylight time got started
+ * in the early 20th century), but IANA tzfiles don't follow that
+ * convention. The tzfile documentation says to use the first
+ * standard-time (i.e., non-DST) tinfo, so that's what we do.
+ */
+inline static const TransitionInfo*
interval_info (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- if (interval)
- return tz->infos + tz->indices[interval - 1];
+ guint index;
+ g_return_val_if_fail (tz->t_info != NULL, NULL);
+ if (interval && tz->transitions && interval <= tz->transitions->len)
+ index = (TRANSITION(interval - 1)).info_index;
+ else
+ {
+ for (index = 0; index < tz->t_info->len; index++)
+ {
+ TransitionInfo *tzinfo = &(TRANSITION_INFO(index));
+ if (!tzinfo->is_dst)
+ return tzinfo;
+ }
+ index = 0;
+ }
- return tz->infos;
+ return &(TRANSITION_INFO(index));
}
inline static gint64
interval_start (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- if (interval)
- return gint64_from_be (tz->trans[interval - 1]);
-
- return G_MININT64;
+ if (!interval || tz->transitions == NULL || tz->transitions->len == 0)
+ return G_MININT64;
+ if (interval > tz->transitions->len)
+ interval = tz->transitions->len;
+ return (TRANSITION(interval - 1)).time;
}
inline static gint64
interval_end (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- if (interval < tz->timecnt)
- return gint64_from_be (tz->trans[interval]) - 1;
-
+ if (tz->transitions && interval < tz->transitions->len)
+ return (TRANSITION(interval)).time - 1;
return G_MAXINT64;
}
inline static gint32
interval_offset (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- return gint32_from_be (interval_info (tz, interval)->tt_gmtoff);
+ g_return_val_if_fail (tz->t_info != NULL, 0);
+ return interval_info (tz, interval)->gmt_offset;
}
inline static gboolean
interval_isdst (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- return interval_info (tz, interval)->tt_isdst;
+ g_return_val_if_fail (tz->t_info != NULL, 0);
+ return interval_info (tz, interval)->is_dst;
}
-inline static guint8
-interval_abbrind (GTimeZone *tz,
- gint interval)
+
+inline static gboolean
+interval_isgmt (GTimeZone *tz,
+ guint interval)
{
- return interval_info (tz, interval)->tt_abbrind;
+ g_return_val_if_fail (tz->t_info != NULL, 0);
+ return interval_info (tz, interval)->is_gmt;
+}
+
+inline static gboolean
+interval_isstandard (GTimeZone *tz,
+ guint interval)
+{
+ return interval_info (tz, interval)->is_standard;
+}
+
+inline static gchar*
+interval_abbrev (GTimeZone *tz,
+ guint interval)
+{
+ g_return_val_if_fail (tz->t_info != NULL, 0);
+ return interval_info (tz, interval)->abbrev;
}
inline static gint64
interval_local_start (GTimeZone *tz,
- gint interval)
+ guint interval)
{
if (interval)
return interval_start (tz, interval) + interval_offset (tz, interval);
@@ -555,9 +1614,9 @@ interval_local_start (GTimeZone *tz,
inline static gint64
interval_local_end (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- if (interval < tz->timecnt)
+ if (tz->transitions && interval < tz->transitions->len)
return interval_end (tz, interval) + interval_offset (tz, interval);
return G_MAXINT64;
@@ -565,9 +1624,11 @@ interval_local_end (GTimeZone *tz,
static gboolean
interval_valid (GTimeZone *tz,
- gint interval)
+ guint interval)
{
- return interval <= tz->timecnt;
+ if ( tz->transitions == NULL)
+ return interval == 0;
+ return interval <= tz->transitions->len;
}
/* g_time_zone_find_interval() {{{1 */
@@ -605,13 +1666,16 @@ g_time_zone_adjust_time (GTimeZone *tz,
gint64 *time_)
{
gint i;
+ guint intervals;
- if (tz->zoneinfo == NULL)
+ if (tz->transitions == NULL)
return 0;
+ intervals = tz->transitions->len;
+
/* find the interval containing *time UTC
* TODO: this could be binary searched (or better) */
- for (i = 0; i < tz->timecnt; i++)
+ for (i = 0; i <= intervals; i++)
if (*time_ <= interval_end (tz, i))
break;
@@ -651,7 +1715,7 @@ g_time_zone_adjust_time (GTimeZone *tz,
if (i && *time_ <= interval_local_end (tz, i - 1))
i--;
- else if (i < tz->timecnt &&
+ else if (i < intervals &&
*time_ >= interval_local_start (tz, i + 1))
i++;
}
@@ -695,11 +1759,12 @@ g_time_zone_find_interval (GTimeZone *tz,
gint64 time_)
{
gint i;
+ guint intervals;
- if (tz->zoneinfo == NULL)
+ if (tz->transitions == NULL)
return 0;
-
- for (i = 0; i < tz->timecnt; i++)
+ intervals = tz->transitions->len;
+ for (i = 0; i <= intervals; i++)
if (time_ <= interval_end (tz, i))
break;
@@ -723,7 +1788,7 @@ g_time_zone_find_interval (GTimeZone *tz,
if (i && time_ <= interval_local_end (tz, i - 1))
i--;
- else if (i < tz->timecnt && time_ >= interval_local_start (tz, i + 1))
+ else if (i < intervals && time_ >= interval_local_start (tz, i + 1))
i++;
}
@@ -752,12 +1817,9 @@ const gchar *
g_time_zone_get_abbreviation (GTimeZone *tz,
gint interval)
{
- g_return_val_if_fail (interval_valid (tz, interval), NULL);
-
- if (tz->header == NULL)
- return "UTC";
+ g_return_val_if_fail (interval_valid (tz, (guint)interval), NULL);
- return tz->abbrs + interval_abbrind (tz, interval);
+ return interval_abbrev (tz, (guint)interval);
}
/**
@@ -781,12 +1843,9 @@ gint32
g_time_zone_get_offset (GTimeZone *tz,
gint interval)
{
- g_return_val_if_fail (interval_valid (tz, interval), 0);
-
- if (tz->header == NULL)
- return 0;
+ g_return_val_if_fail (interval_valid (tz, (guint)interval), 0);
- return interval_offset (tz, interval);
+ return interval_offset (tz, (guint)interval);
}
/**
@@ -807,10 +1866,10 @@ g_time_zone_is_dst (GTimeZone *tz,
{
g_return_val_if_fail (interval_valid (tz, interval), FALSE);
- if (tz->header == NULL)
+ if (tz->transitions == NULL)
return FALSE;
- return interval_isdst (tz, interval);
+ return interval_isdst (tz, (guint)interval);
}
/* Epilogue {{{1 */
diff --git a/glib/glib/gtimezone.h b/glib/glib/gtimezone.h
index c877e8f..536acb1 100644
--- a/glib/glib/gtimezone.h
+++ b/glib/glib/gtimezone.h
@@ -19,13 +19,13 @@
* Author: Ryan Lortie <desrt@desrt.ca>
*/
+#ifndef __G_TIME_ZONE_H__
+#define __G_TIME_ZONE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TIME_ZONE_H__
-#define __G_TIME_ZONE_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -54,25 +54,35 @@ typedef enum
G_TIME_TYPE_UNIVERSAL
} GTimeType;
+GLIB_AVAILABLE_IN_ALL
GTimeZone * g_time_zone_new (const gchar *identifier);
+GLIB_AVAILABLE_IN_ALL
GTimeZone * g_time_zone_new_utc (void);
+GLIB_AVAILABLE_IN_ALL
GTimeZone * g_time_zone_new_local (void);
+GLIB_AVAILABLE_IN_ALL
GTimeZone * g_time_zone_ref (GTimeZone *tz);
+GLIB_AVAILABLE_IN_ALL
void g_time_zone_unref (GTimeZone *tz);
+GLIB_AVAILABLE_IN_ALL
gint g_time_zone_find_interval (GTimeZone *tz,
GTimeType type,
gint64 time_);
+GLIB_AVAILABLE_IN_ALL
gint g_time_zone_adjust_time (GTimeZone *tz,
GTimeType type,
gint64 *time_);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_time_zone_get_abbreviation (GTimeZone *tz,
gint interval);
+GLIB_AVAILABLE_IN_ALL
gint32 g_time_zone_get_offset (GTimeZone *tz,
gint interval);
+GLIB_AVAILABLE_IN_ALL
gboolean g_time_zone_is_dst (GTimeZone *tz,
gint interval);
diff --git a/glib/glib/gtrashstack.h b/glib/glib/gtrashstack.h
index 3f226fe..bff504d 100644
--- a/glib/glib/gtrashstack.h
+++ b/glib/glib/gtrashstack.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_TRASH_STACK_H__
+#define __G_TRASH_STACK_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TRASH_STACK_H__
-#define __G_TRASH_STACK_H__
-
#include <glib/gutils.h>
G_BEGIN_DECLS
diff --git a/glib/glib/gtree.c b/glib/glib/gtree.c
index d67629f..c6b3eea 100644
--- a/glib/glib/gtree.c
+++ b/glib/glib/gtree.c
@@ -888,10 +888,10 @@ g_tree_lookup_extended (GTree *tree,
/**
* g_tree_foreach:
* @tree: a #GTree.
- * @func: the function to call for each node visited. If this function
- * returns %TRUE, the traversal is stopped.
+ * @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.
@@ -945,12 +945,13 @@ g_tree_foreach (GTree *tree,
* @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.
*
* 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.
+ *
+ * Returns: %TRUE to stop the traversal.
**/
/**
* GTraverseType:
diff --git a/glib/glib/gtree.h b/glib/glib/gtree.h
index e17a518..34cb8bb 100644
--- a/glib/glib/gtree.h
+++ b/glib/glib/gtree.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_TREE_H__
+#define __G_TREE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TREE_H__
-#define __G_TREE_H__
-
#include <glib/gnode.h>
G_BEGIN_DECLS
@@ -43,32 +43,45 @@ typedef gboolean (*GTraverseFunc) (gpointer key,
/* Balanced binary trees
*/
+GLIB_AVAILABLE_IN_ALL
GTree* g_tree_new (GCompareFunc key_compare_func);
+GLIB_AVAILABLE_IN_ALL
GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func,
gpointer key_compare_data);
+GLIB_AVAILABLE_IN_ALL
GTree* g_tree_new_full (GCompareDataFunc key_compare_func,
gpointer key_compare_data,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func);
+GLIB_AVAILABLE_IN_ALL
GTree* g_tree_ref (GTree *tree);
+GLIB_AVAILABLE_IN_ALL
void g_tree_unref (GTree *tree);
+GLIB_AVAILABLE_IN_ALL
void g_tree_destroy (GTree *tree);
+GLIB_AVAILABLE_IN_ALL
void g_tree_insert (GTree *tree,
gpointer key,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
void g_tree_replace (GTree *tree,
gpointer key,
gpointer value);
+GLIB_AVAILABLE_IN_ALL
gboolean g_tree_remove (GTree *tree,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
gboolean g_tree_steal (GTree *tree,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
gpointer g_tree_lookup (GTree *tree,
gconstpointer key);
+GLIB_AVAILABLE_IN_ALL
gboolean g_tree_lookup_extended (GTree *tree,
gconstpointer lookup_key,
gpointer *orig_key,
gpointer *value);
+GLIB_AVAILABLE_IN_ALL
void g_tree_foreach (GTree *tree,
GTraverseFunc func,
gpointer user_data);
@@ -79,10 +92,13 @@ void g_tree_traverse (GTree *tree,
GTraverseType traverse_type,
gpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gpointer g_tree_search (GTree *tree,
GCompareFunc search_func,
gconstpointer user_data);
+GLIB_AVAILABLE_IN_ALL
gint g_tree_height (GTree *tree);
+GLIB_AVAILABLE_IN_ALL
gint g_tree_nnodes (GTree *tree);
G_END_DECLS
diff --git a/glib/glib/gtypes.h b/glib/glib/gtypes.h
index 7e4c8ea..c18e0bf 100644
--- a/glib/glib/gtypes.h
+++ b/glib/glib/gtypes.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_TYPES_H__
+#define __G_TYPES_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_TYPES_H__
-#define __G_TYPES_H__
-
#include <glibconfig.h>
#include <glib/gmacros.h>
#include <glib/gversionmacros.h>
@@ -183,8 +183,8 @@ typedef const gchar * (*GTranslateFunc) (const gchar *str,
#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
# if __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
-# define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((gint32) val))
-# define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((gint64) val))
+# define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((gint32) (val)))
+# define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((gint64) (val)))
# endif
# if defined (__i386__)
@@ -477,7 +477,7 @@ G_END_DECLS
# endif /* !GLIB_COMPILATION */
# endif /* !GLIB_STATIC_COMPILATION */
# else /* !G_PLATFORM_WIN32 */
-# define GLIB_VAR extern
+# define GLIB_VAR _GLIB_EXTERN
# endif /* !G_PLATFORM_WIN32 */
#endif /* GLIB_VAR */
diff --git a/glib/glib/gunibreak.h b/glib/glib/gunibreak.h
index 5f884e8..86d0f55 100644
--- a/glib/glib/gunibreak.h
+++ b/glib/glib/gunibreak.h
@@ -7,7 +7,7 @@
#include <glib/gtypes.h>
#include <glib/gunicode.h>
-#define G_UNICODE_DATA_VERSION "6.1.0"
+#define G_UNICODE_DATA_VERSION "6.2.0"
#define G_UNICODE_LAST_CHAR 0x10FFFF
@@ -3866,7 +3866,7 @@ static const gint8 break_property_data[][256] = {
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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ 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,
@@ -4176,7 +4176,7 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
@@ -4283,8 +4283,8 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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,
@@ -4553,8 +4553,8 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
},
{ /* page 38, index 35 */
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS,
@@ -4563,14 +4563,12 @@ static const gint8 break_property_data[][256] = {
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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
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_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
@@ -4583,6 +4581,8 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC,
@@ -4605,7 +4605,7 @@ static const gint8 break_property_data[][256] = {
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_IDEOGRAPHIC, 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,
@@ -4616,7 +4616,7 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
@@ -4647,49 +4647,49 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_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_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
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_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
- G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC
},
{ /* page 39, index 36 */
- 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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
@@ -17445,118 +17445,118 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
},
{ /* page 496, index 134 */
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_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_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
@@ -17690,19 +17690,19 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR
},
{ /* page 498, index 136 */
G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
@@ -17835,23 +17835,23 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
},
{ /* page 499, index 137 */
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, 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_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
@@ -17859,84 +17859,84 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
@@ -17947,15 +17947,15 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, 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_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
@@ -17965,161 +17965,161 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
},
{ /* page 500, index 138 */
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
},
{ /* page 501, index 139 */
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
@@ -18135,18 +18135,18 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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,
@@ -18220,51 +18220,51 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC
},
{ /* page 502, index 140 */
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, 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_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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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,
@@ -18289,41 +18289,41 @@ static const gint8 break_property_data[][256] = {
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
- G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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,
diff --git a/glib/glib/gunichartables.h b/glib/glib/gunichartables.h
index f47d48d..e57f447 100644
--- a/glib/glib/gunichartables.h
+++ b/glib/glib/gunichartables.h
@@ -4,7 +4,7 @@
#ifndef CHARTABLES_H
#define CHARTABLES_H
-#define G_UNICODE_DATA_VERSION "6.1.0"
+#define G_UNICODE_DATA_VERSION "6.2.0"
#define G_UNICODE_LAST_CHAR 0x10ffff
@@ -3263,35 +3263,36 @@ static const char type_data[][256] = {
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_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_NON_SPACING_MARK,
G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK,
G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK,
G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK,
G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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_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_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
},
{ /* page 33, index 31 */
G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
diff --git a/glib/glib/gunicode.h b/glib/glib/gunicode.h
index aafe933..fdf1086 100644
--- a/glib/glib/gunicode.h
+++ b/glib/glib/gunicode.h
@@ -19,13 +19,13 @@
* Boston, MA 02111-1307, USA.
*/
+#ifndef __G_UNICODE_H__
+#define __G_UNICODE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_UNICODE_H__
-#define __G_UNICODE_H__
-
#include <glib/gerror.h>
#include <glib/gtypes.h>
@@ -201,13 +201,12 @@ typedef enum
* @G_UNICODE_BREAK_CLOSE_PARANTHESIS: Closing Parenthesis (CP). Since 2.28
* @G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER: Conditional Japanese Starter (CJ). Since: 2.32
* @G_UNICODE_BREAK_HEBREW_LETTER: Hebrew Letter (HL). Since: 2.32
+ * @G_UNICODE_BREAK_REGIONAL_INDICATOR: Regional Indicator (RI). Since: 2.36
*
* 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.
+ * Since new unicode versions may add new types here, 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>.
*/
@@ -251,7 +250,8 @@ typedef enum
G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
G_UNICODE_BREAK_CLOSE_PARANTHESIS,
G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER,
- G_UNICODE_BREAK_HEBREW_LETTER
+ G_UNICODE_BREAK_HEBREW_LETTER,
+ G_UNICODE_BREAK_REGIONAL_INDICATOR
} GUnicodeBreakType;
/**
@@ -367,7 +367,7 @@ typedef enum
* @G_UNICODE_SCRIPT_MANDAIC: Mandaic. Since 2.28
* @G_UNICODE_SCRIPT_CHAKMA: Chakma. Since: 2.32
* @G_UNICODE_SCRIPT_MEROITIC_CURSIVE: Meroitic Cursive. Since: 2.32
- * @G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, Meroitic Hieroglyphs. Since: 2.32
+ * @G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS: Meroitic Hieroglyphs. Since: 2.32
* @G_UNICODE_SCRIPT_MIAO: Miao. Since: 2.32
* @G_UNICODE_SCRIPT_SHARADA: Sharada. Since: 2.32
* @G_UNICODE_SCRIPT_SORA_SOMPENG: Sora Sompeng. Since: 2.32
@@ -506,66 +506,99 @@ typedef enum
G_UNICODE_SCRIPT_TAKRI /* Takr */
} GUnicodeScript;
+GLIB_AVAILABLE_IN_ALL
guint32 g_unicode_script_to_iso15924 (GUnicodeScript script);
+GLIB_AVAILABLE_IN_ALL
GUnicodeScript g_unicode_script_from_iso15924 (guint32 iso15924);
/* These are all analogs of the <ctype.h> functions.
*/
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_islower (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_iswide_cjk(gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_iszerowidth(gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
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. */
+GLIB_AVAILABLE_IN_ALL
gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gunichar g_unichar_totitle (gunichar c) G_GNUC_CONST;
-/* If C is a digit (according to `g_unichar_isdigit'), then return its
+/* If C is a digit (according to 'g_unichar_isdigit'), then return its
numeric value. Otherwise return -1. */
+GLIB_AVAILABLE_IN_ALL
gint g_unichar_digit_value (gunichar c) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST;
/* Return the Unicode character type of a given character. */
+GLIB_AVAILABLE_IN_ALL
GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST;
/* Return the line break property for a given character */
+GLIB_AVAILABLE_IN_ALL
GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST;
/* Returns the combining class for a given character */
+GLIB_AVAILABLE_IN_ALL
gint g_unichar_combining_class (gunichar uc) G_GNUC_CONST;
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_get_mirror_char (gunichar ch,
gunichar *mirrored_ch);
+GLIB_AVAILABLE_IN_ALL
GUnicodeScript g_unichar_get_script (gunichar ch) G_GNUC_CONST;
/* Validate a Unicode character */
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_validate (gunichar ch) G_GNUC_CONST;
/* Pairwise canonical compose/decompose */
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_compose (gunichar a,
gunichar b,
gunichar *ch);
+GLIB_AVAILABLE_IN_ALL
gboolean g_unichar_decompose (gunichar ch,
gunichar *a,
gunichar *b);
+GLIB_AVAILABLE_IN_ALL
gsize g_unichar_fully_decompose (gunichar ch,
gboolean compat,
gunichar *result,
@@ -586,6 +619,7 @@ gsize g_unichar_fully_decompose (gunichar ch,
/* 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. */
+GLIB_AVAILABLE_IN_ALL
void g_unicode_canonical_ordering (gunichar *string,
gsize len);
@@ -611,20 +645,28 @@ GLIB_VAR const gchar * const g_utf8_skip;
*/
#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(const guchar *)(p)])
+GLIB_AVAILABLE_IN_ALL
gunichar g_utf8_get_char (const gchar *p) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gunichar g_utf8_get_char_validated (const gchar *p,
gssize max_len) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_offset_to_pointer (const gchar *str,
glong offset) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
glong g_utf8_pointer_to_offset (const gchar *str,
const gchar *pos) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_prev_char (const gchar *p) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_find_next_char (const gchar *p,
const gchar *end) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_find_prev_char (const gchar *str,
const gchar *p) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
glong g_utf8_strlen (const gchar *p,
gssize max) G_GNUC_PURE;
@@ -633,66 +675,82 @@ gchar *g_utf8_substring (const gchar *str,
glong start_pos,
glong end_pos) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
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 */
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_strchr (const gchar *p,
gssize len,
gunichar c);
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_strrchr (const gchar *p,
gssize len,
gunichar c);
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf8_strreverse (const gchar *str,
gssize len);
+GLIB_AVAILABLE_IN_ALL
gunichar2 *g_utf8_to_utf16 (const gchar *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gunichar * g_utf8_to_ucs4 (const gchar *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gunichar * g_utf8_to_ucs4_fast (const gchar *str,
glong len,
glong *items_written) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gunichar * g_utf16_to_ucs4 (const gunichar2 *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_utf16_to_utf8 (const gunichar2 *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gunichar2 *g_ucs4_to_utf16 (const gunichar *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar* g_ucs4_to_utf8 (const gunichar *str,
glong len,
glong *items_read,
glong *items_written,
GError **error) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gint g_unichar_to_utf8 (gunichar c,
gchar *outbuf);
+GLIB_AVAILABLE_IN_ALL
gboolean g_utf8_validate (const gchar *str,
gssize max_len,
const gchar **end);
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_strup (const gchar *str,
gssize len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_strdown (const gchar *str,
gssize len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_casefold (const gchar *str,
gssize len) G_GNUC_MALLOC;
@@ -731,20 +789,23 @@ typedef enum {
G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
} GNormalizeMode;
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_normalize (const gchar *str,
gssize len,
GNormalizeMode mode) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gint g_utf8_collate (const gchar *str1,
const gchar *str2) G_GNUC_PURE;
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_collate_key (const gchar *str,
gssize len) G_GNUC_MALLOC;
+GLIB_AVAILABLE_IN_ALL
gchar *g_utf8_collate_key_for_filename (const gchar *str,
gssize len) G_GNUC_MALLOC;
/* private */
-
gchar *_g_utf8_make_valid (const gchar *name);
G_END_DECLS
diff --git a/glib/glib/gunicodeprivate.h b/glib/glib/gunicodeprivate.h
index c6cca84..c5af3b5 100644
--- a/glib/glib/gunicodeprivate.h
+++ b/glib/glib/gunicodeprivate.h
@@ -25,9 +25,8 @@
G_BEGIN_DECLS
-G_GNUC_INTERNAL gunichar *_g_utf8_normalize_wc
- (const gchar *str,
- gssize max_len,
+gunichar *_g_utf8_normalize_wc (const gchar *str,
+ gssize max_len,
GNormalizeMode mode);
G_END_DECLS
diff --git a/glib/glib/gunicollate.c b/glib/glib/gunicollate.c
index 3649786..050dd60 100644
--- a/glib/glib/gunicollate.c
+++ b/glib/glib/gunicollate.c
@@ -217,29 +217,28 @@ collate_key_to_string (UCCollationValue *key,
gsize key_len)
{
gchar *result;
- gsize result_len;
+ gsize result_len = 0;
+ const gsize start = 2 * sizeof (void *) / sizeof (UCCollationValue);
gsize i;
- /* Pretty smart algorithm here: ignore first eight bytes of the
- * collation key. It doesn't produce results equivalent to
- * UCCompareCollationKeys's, but the difference seems to be only
- * that UCCompareCollationKeys in some cases produces 0 where our
- * comparison gets -1 or 1. */
-
- if (key_len * sizeof (UCCollationValue) <= 8)
+ /* The first codes should be skipped: the same string on the same
+ * system can get different values at runtime in those positions,
+ * and they do not sort correctly. The exact size of the prefix
+ * depends on whether we are building 64 or 32 bit.
+ */
+ if (key_len <= start)
return g_strdup ("");
- result_len = 0;
- for (i = 8; i < key_len * sizeof (UCCollationValue); i++)
- /* there may be nul bytes, encode byteval+1 */
- result_len += utf8_encode (NULL, *((guchar*)key + i) + 1);
+ for (i = start; i < key_len; i++)
+ result_len += utf8_encode (NULL, g_htonl (key[i] + 1));
result = g_malloc (result_len + 1);
result_len = 0;
- for (i = 8; i < key_len * sizeof (UCCollationValue); i++)
- result_len += utf8_encode (result + result_len, *((guchar*)key + i) + 1);
+ for (i = start; i < key_len; i++)
+ result_len += utf8_encode (result + result_len, g_htonl (key[i] + 1));
+
+ result[result_len] = '\0';
- result[result_len] = 0;
return result;
}
diff --git a/glib/glib/gunicomp.h b/glib/glib/gunicomp.h
index a686553..f389279 100644
--- a/glib/glib/gunicomp.h
+++ b/glib/glib/gunicomp.h
@@ -1,9 +1,9 @@
#define COMPOSE_FIRST_START 1
#define COMPOSE_FIRST_SINGLE_START 147
-#define COMPOSE_SECOND_START 371
-#define COMPOSE_SECOND_SINGLE_START 402
+#define COMPOSE_SECOND_START 373
+#define COMPOSE_SECOND_SINGLE_START 404
-#define COMPOSE_TABLE_LAST 272
+#define COMPOSE_TABLE_LAST 273
static const guint16 compose_data[][256] = {
{ /* page 0, index 0 */
@@ -48,10 +48,10 @@ static const guint16 compose_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{ /* page 3, index 3 */
- 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 0, 0, 383,
- 0, 384, 0, 385, 386, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 388,
- 389, 390, 391, 392, 393, 0, 0, 0, 0, 394, 395, 0, 396, 397, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0,
+ 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 384, 0, 0, 385,
+ 0, 386, 0, 387, 388, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 390,
+ 391, 392, 393, 394, 395, 0, 0, 0, 0, 396, 397, 0, 398, 399, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 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, 71, 0, 0, 0,
@@ -79,7 +79,7 @@ static const guint16 compose_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 402, 403, 404, 0, 0, 0, 0, 0, 0, 0,
+ 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 404, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -96,22 +96,22 @@ static const guint16 compose_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405,
+ 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, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 406, 0, 0, 0, 0, 0, 0, 0, 0, 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 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, 407, 0, 0, 0, 0, 0, 0, 0, 0,
- 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 409, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0,
+ 101, 0, 0, 0, 0, 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, 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, 410, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 411, 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, 102, 219, 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
},
{ /* page 12, index 8 */
@@ -123,21 +123,21 @@ static const guint16 compose_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221,
- 0, 0, 412, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413,
- 414, 0, 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, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415,
+ 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, 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, 415, 0, 0, 0, 0, 0, 0, 0, 104,
- 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 104,
+ 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 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 */
@@ -228,7 +228,7 @@ static const guint16 compose_data[][256] = {
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, 400, 401,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 403,
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,
@@ -247,6 +247,19 @@ static const guint16 compose_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 273, 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, 371, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}
};
@@ -523,7 +536,8 @@ static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = {
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
- 17 /* page 272 */
+ 17 /* page 272 */,
+ 18 /* page 273 */
};
static const gunichar compose_first_single[][2] = {
@@ -750,7 +764,9 @@ static const gunichar compose_first_single[][2] = {
{ 0x3099, 0x30fe },
{ 0x110ba, 0x1109a },
{ 0x110ba, 0x1109c },
- { 0x110ba, 0x110ab }
+ { 0x110ba, 0x110ab },
+ { 0x11127, 0x1112e },
+ { 0x11127, 0x1112f }
};
static const guint16 compose_second_single[][2] = {
{ 0x0627, 0x0622 },
diff --git a/glib/glib/gunidecomp.h b/glib/glib/gunidecomp.h
index cf41100..0e94779 100644
--- a/glib/glib/gunidecomp.h
+++ b/glib/glib/gunidecomp.h
@@ -96,8 +96,9 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 230, 230, 220, 230, 230, 220, 230, 230, 230, 220, 220, 220,
+ 27, 28, 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230,
+ 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,
@@ -277,7 +278,7 @@ static const guchar cclass_data[][256] = {
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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 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, 7, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
@@ -293,8 +294,8 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 1, 220,
220, 220, 220, 220, 230, 230, 220, 220, 220, 220, 230, 0, 1, 1, 1, 1, 1,
- 1, 1, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0
+ 1, 1, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
},
{ /* page 29, 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,
@@ -369,13 +370,13 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 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, 230, 0, 0, 0, 0, 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, 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, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{ /* page 168, index 27 */
0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -415,7 +416,7 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 230, 230, 220, 0, 0, 230, 230, 0, 0, 0,
0, 0, 230, 230, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{ /* page 171, index 30 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -495,7 +496,33 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
- { /* page 465, index 36 */
+ { /* page 273, index 36 */
+ 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, 9, 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, 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
+ },
+ { /* page 278, index 37 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 465, index 38 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -509,7 +536,7 @@ static const guchar cclass_data[][256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0
},
- { /* page 466, index 37 */
+ { /* page 466, index 39 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
@@ -798,10 +825,12 @@ static const gint16 combining_class_table_part1[763] = {
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
35 /* page 272 */,
+ 36 /* page 273 */,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
+ 37 /* page 278 */,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
@@ -988,10 +1017,8 @@ 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 + G_UNICODE_MAX_TABLE_INDEX,
- 0 + G_UNICODE_MAX_TABLE_INDEX,
- 36 /* page 465 */,
- 37 /* page 466 */,
+ 38 /* page 465 */,
+ 39 /* page 466 */,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
0 + G_UNICODE_MAX_TABLE_INDEX,
@@ -4406,1194 +4433,1198 @@ static const decomposition decomp_table[] =
{ 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10866 },
{ 0x33ff, G_UNICODE_NOT_PRESENT_OFFSET, 10872 },
{ 0xa770, G_UNICODE_NOT_PRESENT_OFFSET, 10876 },
- { 0xf900, 10880, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf901, 10884, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xa7f8, G_UNICODE_NOT_PRESENT_OFFSET, 10880 },
+ { 0xa7f9, G_UNICODE_NOT_PRESENT_OFFSET, 10883 },
+ { 0xf900, 10886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf901, 10890, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf902, 6813, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf903, 10888, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf904, 10892, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf905, 10896, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf906, 10900, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf903, 10894, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf904, 10898, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf905, 10902, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf906, 10906, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf907, 7029, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf908, 7029, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf909, 10904, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf909, 10910, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf90a, 6845, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf90b, 10908, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf90c, 10912, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf90d, 10916, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf90e, 10920, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf90f, 10924, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf910, 10928, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf911, 10932, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf912, 10936, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf913, 10940, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf914, 10944, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf915, 10948, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf916, 10952, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf917, 10956, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf918, 10960, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf919, 10964, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91a, 10968, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91b, 10972, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91c, 10976, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91d, 10980, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91e, 10984, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf91f, 10988, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf920, 10992, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf921, 10996, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf922, 11000, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf923, 11004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf924, 11008, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf925, 11012, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf926, 11016, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf927, 11020, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf928, 11024, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf929, 11028, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92a, 11032, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92b, 11036, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92c, 11040, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92d, 11044, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92e, 11048, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf92f, 11052, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf930, 11056, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf931, 11060, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf932, 11064, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf933, 11068, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90b, 10914, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90c, 10918, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90d, 10922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90e, 10926, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90f, 10930, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf910, 10934, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf911, 10938, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf912, 10942, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf913, 10946, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf914, 10950, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf915, 10954, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf916, 10958, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf917, 10962, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf918, 10966, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf919, 10970, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91a, 10974, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91b, 10978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91c, 10982, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91d, 10986, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91e, 10990, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91f, 10994, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf920, 10998, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf921, 11002, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf922, 11006, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf923, 11010, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf924, 11014, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf925, 11018, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf926, 11022, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf927, 11026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf928, 11030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf929, 11034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92a, 11038, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92b, 11042, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92c, 11046, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92d, 11050, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92e, 11054, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92f, 11058, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf930, 11062, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf931, 11066, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf932, 11070, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf933, 11074, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf934, 6677, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf935, 11072, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf936, 11076, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf937, 11080, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf938, 11084, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf939, 11088, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93a, 11092, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93b, 11096, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93c, 11100, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93d, 11104, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93e, 11108, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf93f, 11112, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf935, 11078, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf936, 11082, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf937, 11086, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf938, 11090, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf939, 11094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93a, 11098, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93b, 11102, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93c, 11106, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93d, 11110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93e, 11114, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93f, 11118, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf940, 6969, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf941, 11116, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf942, 11120, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf943, 11124, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf944, 11128, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf945, 11132, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf946, 11136, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf947, 11140, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf948, 11144, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf949, 11148, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94a, 11152, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94b, 11156, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94c, 11160, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94d, 11164, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94e, 11168, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf94f, 11172, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf950, 11176, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf951, 11180, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf952, 11184, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf953, 11188, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf954, 11192, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf955, 11196, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf956, 11200, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf957, 11204, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf958, 11208, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf959, 11212, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95a, 11216, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95b, 11220, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95c, 10944, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95d, 11224, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95e, 11228, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf95f, 11232, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf960, 11236, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf961, 11240, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf962, 11244, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf963, 11248, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf964, 11252, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf965, 11256, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf966, 11260, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf967, 11264, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf968, 11268, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf969, 11272, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96a, 11276, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96b, 11280, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96c, 11284, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96d, 11288, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96e, 11292, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf96f, 11296, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf970, 11300, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf941, 11122, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf942, 11126, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf943, 11130, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf944, 11134, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf945, 11138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf946, 11142, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf947, 11146, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf948, 11150, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf949, 11154, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94a, 11158, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94b, 11162, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94c, 11166, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94d, 11170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94e, 11174, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94f, 11178, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf950, 11182, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf951, 11186, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf952, 11190, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf953, 11194, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf954, 11198, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf955, 11202, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf956, 11206, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf957, 11210, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf958, 11214, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf959, 11218, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95a, 11222, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95b, 11226, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95c, 10950, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95d, 11230, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95e, 11234, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95f, 11238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf960, 11242, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf961, 11246, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf962, 11250, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf963, 11254, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf964, 11258, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf965, 11262, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf966, 11266, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf967, 11270, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf968, 11274, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf969, 11278, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96a, 11282, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96b, 11286, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96c, 11290, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96d, 11294, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96e, 11298, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96f, 11302, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf970, 11306, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf971, 6821, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf972, 11304, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf973, 11308, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf974, 11312, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf975, 11316, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf976, 11320, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf977, 11324, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf978, 11328, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf979, 11332, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97a, 11336, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97b, 11340, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97c, 11344, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97d, 11348, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97e, 11352, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf97f, 11356, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf980, 11360, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf972, 11310, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf973, 11314, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf974, 11318, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf975, 11322, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf976, 11326, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf977, 11330, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf978, 11334, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf979, 11338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97a, 11342, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97b, 11346, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97c, 11350, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97d, 11354, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97e, 11358, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97f, 11362, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf980, 11366, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf981, 6329, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf982, 11364, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf983, 11368, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf984, 11372, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf985, 11376, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf986, 11380, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf987, 11384, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf988, 11388, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf989, 11392, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf982, 11370, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf983, 11374, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf984, 11378, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf985, 11382, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf986, 11386, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf987, 11390, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf988, 11394, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf989, 11398, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf98a, 6253, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf98b, 11396, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf98c, 11400, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf98d, 11404, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf98e, 11408, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf98f, 11412, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf990, 11416, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf991, 11420, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf992, 11424, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf993, 11428, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf994, 11432, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf995, 11436, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf996, 11440, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf997, 11444, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf998, 11448, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf999, 11452, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99a, 11456, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99b, 11460, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99c, 11464, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99d, 11468, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99e, 11472, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf99f, 11476, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a0, 11480, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a1, 11296, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a2, 11484, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a3, 11488, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a4, 11492, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a5, 11496, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a6, 11500, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a7, 11504, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a8, 11508, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9a9, 11512, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9aa, 11232, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ab, 11516, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ac, 11520, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ad, 11524, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ae, 11528, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9af, 11532, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b0, 11536, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b1, 11540, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b2, 11544, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b3, 11548, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b4, 11552, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b5, 11556, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b6, 11560, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b7, 11564, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b8, 11568, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9b9, 11572, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ba, 11576, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9bb, 11580, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9bc, 11584, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9bd, 11588, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9be, 11592, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9bf, 10944, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c0, 11596, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c1, 11600, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c2, 11604, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c3, 11608, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98b, 11402, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98c, 11406, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98d, 11410, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98e, 11414, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98f, 11418, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf990, 11422, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf991, 11426, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf992, 11430, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf993, 11434, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf994, 11438, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf995, 11442, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf996, 11446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf997, 11450, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf998, 11454, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf999, 11458, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99a, 11462, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99b, 11466, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99c, 11470, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99d, 11474, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99e, 11478, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99f, 11482, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a0, 11486, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a1, 11302, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a2, 11490, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a3, 11494, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a4, 11498, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a5, 11502, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a6, 11506, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a7, 11510, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a8, 11514, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a9, 11518, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9aa, 11238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ab, 11522, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ac, 11526, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ad, 11530, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ae, 11534, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9af, 11538, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b0, 11542, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b1, 11546, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b2, 11550, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b3, 11554, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b4, 11558, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b5, 11562, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b6, 11566, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b7, 11570, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b8, 11574, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b9, 11578, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ba, 11582, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bb, 11586, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bc, 11590, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bd, 11594, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9be, 11598, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bf, 10950, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c0, 11602, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c1, 11606, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c2, 11610, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c3, 11614, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf9c4, 7025, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c5, 11612, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c6, 11616, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c7, 11620, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c8, 11624, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9c9, 11628, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ca, 11632, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9cb, 11636, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9cc, 11640, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9cd, 11644, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ce, 11648, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9cf, 11652, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d0, 11656, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c5, 11618, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c6, 11622, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c7, 11626, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c8, 11630, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c9, 11634, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ca, 11638, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cb, 11642, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cc, 11646, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cd, 11650, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ce, 11654, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cf, 11658, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d0, 11662, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf9d1, 8562, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d2, 11660, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d3, 11664, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d4, 11668, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d5, 11672, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d6, 11676, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d7, 11680, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d8, 11684, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9d9, 11688, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9da, 11692, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9db, 11240, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9dc, 11696, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9dd, 11700, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9de, 11704, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9df, 11708, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e0, 11712, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e1, 11716, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e2, 11720, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e3, 11724, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e4, 11728, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e5, 11732, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e6, 11736, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e7, 11740, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9e8, 11744, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d2, 11666, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d3, 11670, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d4, 11674, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d5, 11678, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d6, 11682, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d7, 11686, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d8, 11690, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d9, 11694, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9da, 11698, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9db, 11246, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9dc, 11702, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9dd, 11706, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9de, 11710, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9df, 11714, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e0, 11718, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e1, 11722, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e2, 11726, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e3, 11730, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e4, 11734, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e5, 11738, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e6, 11742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e7, 11746, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e8, 11750, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf9e9, 6841, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ea, 11748, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9eb, 11752, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ec, 11756, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ed, 11760, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ee, 11764, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ef, 11768, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f0, 11772, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f1, 11776, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f2, 11780, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f3, 11784, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f4, 11788, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f5, 11792, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f6, 11796, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ea, 11754, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9eb, 11758, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ec, 11762, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ed, 11766, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ee, 11770, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ef, 11774, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f0, 11778, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f1, 11782, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f2, 11786, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f3, 11790, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f4, 11794, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f5, 11798, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f6, 11802, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xf9f7, 6645, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f8, 11800, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9f9, 11804, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9fa, 11808, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9fb, 11812, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9fc, 11816, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9fd, 11820, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9fe, 11824, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xf9ff, 11828, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa00, 11832, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa01, 11836, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa02, 11840, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa03, 11844, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa04, 11848, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa05, 11852, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa06, 11856, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa07, 11860, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f8, 11806, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f9, 11810, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fa, 11814, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fb, 11818, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fc, 11822, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fd, 11826, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fe, 11830, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ff, 11834, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa00, 11838, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa01, 11842, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa02, 11846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa03, 11850, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa04, 11854, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa05, 11858, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa06, 11862, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa07, 11866, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa08, 6753, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa09, 11864, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa09, 11870, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa0a, 6765, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa0b, 11868, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa0c, 11872, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa0d, 11876, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa10, 11880, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa12, 11884, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa15, 11888, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa16, 11892, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa17, 11896, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa18, 11900, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa19, 11904, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa1a, 11908, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa1b, 11912, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa1c, 11916, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa1d, 11920, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0b, 11874, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0c, 11878, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0d, 11882, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa10, 11886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa12, 11890, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa15, 11894, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa16, 11898, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa17, 11902, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa18, 11906, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa19, 11910, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1a, 11914, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1b, 11918, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1c, 11922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1d, 11926, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa1e, 6673, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa20, 11924, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa22, 11928, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa25, 11932, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa26, 11936, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa2a, 11940, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa2b, 11944, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa2c, 11948, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa2d, 11952, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa30, 11956, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa31, 11960, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa32, 11964, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa33, 11968, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa34, 11972, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa35, 11976, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa36, 11980, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa37, 11984, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa38, 11988, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa39, 11992, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa3a, 11996, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa3b, 12000, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa20, 11930, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa22, 11934, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa25, 11938, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa26, 11942, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2a, 11946, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2b, 11950, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2c, 11954, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2d, 11958, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2e, 11962, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2f, 11966, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa30, 11970, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa31, 11974, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa32, 11978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa33, 11982, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa34, 11986, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa35, 11990, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa36, 11994, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa37, 11998, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa38, 12002, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa39, 12006, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3a, 12010, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3b, 12014, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa3c, 6357, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa3d, 12004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa3e, 12008, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa3f, 12012, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa40, 12016, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa41, 12020, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa42, 12024, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa43, 12028, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa44, 12032, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa45, 12036, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa46, 12040, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa47, 12044, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa48, 12048, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa49, 12052, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa4a, 12056, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa4b, 12060, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3d, 12018, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3e, 12022, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3f, 12026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa40, 12030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa41, 12034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa42, 12038, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa43, 12042, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa44, 12046, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa45, 12050, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa46, 12054, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa47, 12058, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa48, 12062, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa49, 12066, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4a, 12070, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4b, 12074, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa4c, 8582, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa4d, 12064, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa4e, 12068, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa4f, 12072, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa50, 12076, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4d, 12078, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4e, 12082, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4f, 12086, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa50, 12090, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa51, 8598, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa52, 12080, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa53, 12084, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa54, 12088, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa55, 12092, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa56, 12096, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa57, 11440, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa58, 12100, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa59, 12104, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5a, 12108, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5b, 12112, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5c, 12116, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5d, 12120, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5e, 12120, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa5f, 12124, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa60, 12128, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa61, 12132, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa62, 12136, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa63, 12140, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa64, 12144, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa65, 12148, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa66, 12152, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa67, 11932, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa68, 12156, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa69, 12160, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa6a, 12164, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa6b, 12168, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa6c, 12172, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa6d, 12177, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa70, 12181, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa71, 12185, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa72, 12189, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa73, 12193, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa74, 12197, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa75, 12201, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa76, 12205, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa77, 12209, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa78, 11980, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa79, 12213, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7a, 12217, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7b, 12221, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7c, 11880, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7d, 12225, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7e, 12229, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa7f, 12233, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa80, 12237, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa81, 12241, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa82, 12245, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa83, 12249, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa84, 12253, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa85, 12257, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa86, 12261, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa87, 12265, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa88, 12269, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa89, 12012, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8a, 12273, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8b, 12016, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8c, 12277, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8d, 12281, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8e, 12285, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa8f, 12289, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa90, 12293, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa91, 11884, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa92, 11028, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa93, 12297, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa94, 12301, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa52, 12094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa53, 12098, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa54, 12102, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa55, 12106, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa56, 12110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa57, 11446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa58, 12114, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa59, 12118, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5a, 12122, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5b, 12126, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5c, 12130, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5d, 12134, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5e, 12134, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5f, 12138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa60, 12142, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa61, 12146, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa62, 12150, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa63, 12154, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa64, 12158, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa65, 12162, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa66, 12166, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa67, 11938, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa68, 12170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa69, 12174, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa6a, 12178, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa6b, 12182, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa6c, 12186, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa6d, 12191, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa70, 12195, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa71, 12199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa72, 12203, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa73, 12207, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa74, 12211, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa75, 12215, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa76, 12219, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa77, 12223, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa78, 11994, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa79, 12227, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7a, 12231, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7b, 12235, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7c, 11886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7d, 12239, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7e, 12243, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7f, 12247, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa80, 12251, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa81, 12255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa82, 12259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa83, 12263, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa84, 12267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa85, 12271, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa86, 12275, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa87, 12279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa88, 12283, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa89, 12026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8a, 12287, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8b, 12030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8c, 12291, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8d, 12295, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8e, 12299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8f, 12303, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa90, 12307, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa91, 11890, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa92, 11034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa93, 12311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa94, 12315, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xfa95, 6489, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa96, 11300, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa97, 11632, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa98, 12305, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa99, 12309, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9a, 12044, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9b, 12313, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9c, 12048, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9d, 12317, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9e, 12321, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfa9f, 12325, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa0, 11892, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa1, 12329, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa2, 12333, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa3, 12337, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa4, 12341, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa5, 12345, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa6, 11896, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa7, 12349, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa8, 12353, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaa9, 12357, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaaa, 12361, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaab, 12365, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaac, 12369, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaad, 12096, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaae, 12373, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaaf, 12377, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab0, 11440, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab1, 12381, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab2, 12112, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab3, 12385, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab4, 12389, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab5, 12393, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab6, 12397, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab7, 12401, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab8, 12132, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfab9, 12405, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaba, 11928, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfabb, 12409, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfabc, 12136, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfabd, 11224, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfabe, 12413, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfabf, 12140, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac0, 12417, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac1, 12148, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac2, 12421, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac3, 12425, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac4, 12429, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac5, 12433, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac6, 12437, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac7, 12156, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac8, 11916, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfac9, 12441, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfaca, 12160, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfacb, 12445, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfacc, 12164, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfacd, 12449, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa96, 11306, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa97, 11638, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa98, 12319, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa99, 12323, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9a, 12058, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9b, 12327, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9c, 12062, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9d, 12331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9e, 12335, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9f, 12339, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa0, 11898, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa1, 12343, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa2, 12347, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa3, 12351, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa4, 12355, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa5, 12359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa6, 11902, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa7, 12363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa8, 12367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa9, 12371, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaaa, 12375, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaab, 12379, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaac, 12383, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaad, 12110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaae, 12387, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaaf, 12391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab0, 11446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab1, 12395, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab2, 12126, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab3, 12399, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab4, 12403, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab5, 12407, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab6, 12411, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab7, 12415, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab8, 12146, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab9, 12419, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaba, 11934, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabb, 12423, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabc, 12150, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabd, 11230, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabe, 12427, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabf, 12154, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac0, 12431, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac1, 12162, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac2, 12435, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac3, 12439, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac4, 12443, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac5, 12447, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac6, 12451, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac7, 12170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac8, 11922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac9, 12455, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaca, 12174, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacb, 12459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacc, 12178, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacd, 12463, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0xface, 7029, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfacf, 12453, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad0, 12458, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad1, 12463, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad2, 12468, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad3, 12472, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad4, 12476, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad5, 12480, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad6, 12485, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad7, 12490, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad8, 12495, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfad9, 12499, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 12503 },
- { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 12506 },
- { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 12509 },
- { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 12512 },
- { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 12516 },
- { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 12520 },
- { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 12520 },
- { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 12523 },
- { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 12528 },
- { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 12533 },
- { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 12538 },
- { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 12543 },
- { 0xfb1d, 12548, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb1f, 12553, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 12558 },
+ { 0xfacf, 12467, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad0, 12472, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad1, 12477, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad2, 12482, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad3, 12486, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad4, 12490, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad5, 12494, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad6, 12499, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad7, 12504, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad8, 12509, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad9, 12513, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 12517 },
+ { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 12520 },
+ { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 12523 },
+ { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 12526 },
+ { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 12530 },
+ { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 12534 },
+ { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 12534 },
+ { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 12537 },
+ { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 12542 },
+ { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 12547 },
+ { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 12552 },
+ { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 12557 },
+ { 0xfb1d, 12562, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb1f, 12567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 12572 },
{ 0xfb21, G_UNICODE_NOT_PRESENT_OFFSET, 5338 },
{ 0xfb22, G_UNICODE_NOT_PRESENT_OFFSET, 5347 },
- { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 12561 },
- { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 12564 },
- { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 12567 },
- { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 12570 },
- { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 12573 },
- { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 12576 },
+ { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 12575 },
+ { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 12578 },
+ { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 12581 },
+ { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 12584 },
+ { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 12587 },
+ { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 12590 },
{ 0xfb29, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
- { 0xfb2a, 12579, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb2b, 12584, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb2c, 12589, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb2d, 12596, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb2e, 12603, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb2f, 12608, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb30, 12613, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb31, 12618, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb32, 12623, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb33, 12628, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb34, 12633, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb35, 12638, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb36, 12643, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb38, 12648, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb39, 12653, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb3a, 12658, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb3b, 12663, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb3c, 12668, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb3e, 12673, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb40, 12678, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb41, 12683, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb43, 12688, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb44, 12693, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb46, 12698, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb47, 12703, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb48, 12708, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb49, 12713, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4a, 12718, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4b, 12723, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4c, 12728, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4d, 12733, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4e, 12738, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 12743 },
- { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12748 },
- { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12748 },
- { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
- { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
- { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
- { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
- { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
- { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
- { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
- { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
- { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
- { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
- { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
- { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
- { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
- { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
- { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
- { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
- { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
- { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
- { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
- { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
- { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
- { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
- { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
- { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
- { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
- { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
- { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
- { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
- { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
- { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
- { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
- { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
- { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
- { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
- { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
- { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
- { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
- { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
- { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
- { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
- { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
- { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
- { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
- { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
- { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
- { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
- { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
- { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
- { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12787 },
- { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12787 },
- { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12790 },
- { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12790 },
- { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12793 },
- { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12793 },
- { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12796 },
- { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12796 },
- { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
- { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
- { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
- { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
- { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
- { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
- { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
- { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
- { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12808 },
- { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12808 },
- { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12808 },
- { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12808 },
- { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12811 },
- { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12811 },
- { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12811 },
- { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12811 },
- { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12814 },
- { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12814 },
- { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12814 },
- { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12814 },
- { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12817 },
- { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12817 },
- { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12820 },
- { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12820 },
- { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12820 },
- { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12820 },
+ { 0xfb2a, 12593, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2b, 12598, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2c, 12603, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2d, 12610, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2e, 12617, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2f, 12622, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb30, 12627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb31, 12632, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb32, 12637, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb33, 12642, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb34, 12647, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb35, 12652, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb36, 12657, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb38, 12662, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb39, 12667, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3a, 12672, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3b, 12677, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3c, 12682, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3e, 12687, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb40, 12692, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb41, 12697, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb43, 12702, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb44, 12707, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb46, 12712, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb47, 12717, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb48, 12722, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb49, 12727, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4a, 12732, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4b, 12737, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4c, 12742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4d, 12747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4e, 12752, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
+ { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12762 },
+ { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12762 },
+ { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12765 },
+ { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12765 },
+ { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12765 },
+ { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12765 },
+ { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12768 },
+ { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12768 },
+ { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12768 },
+ { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12768 },
+ { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12771 },
+ { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12771 },
+ { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12771 },
+ { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12771 },
+ { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12774 },
+ { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12774 },
+ { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12774 },
+ { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12774 },
+ { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12777 },
+ { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12777 },
+ { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12777 },
+ { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12777 },
+ { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12780 },
+ { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12780 },
+ { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12780 },
+ { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12780 },
+ { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12783 },
+ { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12783 },
+ { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12783 },
+ { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12783 },
+ { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12786 },
+ { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12786 },
+ { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12786 },
+ { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12786 },
+ { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12789 },
+ { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12789 },
+ { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12789 },
+ { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12789 },
+ { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12792 },
+ { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12792 },
+ { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12792 },
+ { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12792 },
+ { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12795 },
+ { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12795 },
+ { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12795 },
+ { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12795 },
+ { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12798 },
+ { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12798 },
+ { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12798 },
+ { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12798 },
+ { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12801 },
+ { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12801 },
+ { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12804 },
+ { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12804 },
+ { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12807 },
+ { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12807 },
+ { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12810 },
+ { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12810 },
+ { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12813 },
+ { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12813 },
+ { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12816 },
+ { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12816 },
+ { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12822 },
+ { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12822 },
+ { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12822 },
+ { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12822 },
+ { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12825 },
+ { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12825 },
+ { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12825 },
+ { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12825 },
+ { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12828 },
+ { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12828 },
+ { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12828 },
+ { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12828 },
+ { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12831 },
+ { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12831 },
+ { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12834 },
+ { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12834 },
+ { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12834 },
+ { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12834 },
{ 0xfba4, G_UNICODE_NOT_PRESENT_OFFSET, 1721 },
{ 0xfba5, G_UNICODE_NOT_PRESENT_OFFSET, 1721 },
- { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12823 },
- { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12823 },
- { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12823 },
- { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12823 },
- { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
- { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
- { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
- { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
- { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12829 },
- { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12829 },
+ { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12837 },
+ { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12837 },
+ { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12837 },
+ { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12837 },
+ { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12843 },
+ { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12843 },
{ 0xfbb0, G_UNICODE_NOT_PRESENT_OFFSET, 1731 },
{ 0xfbb1, G_UNICODE_NOT_PRESENT_OFFSET, 1731 },
- { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12832 },
- { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12832 },
- { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12832 },
- { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12832 },
- { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12835 },
- { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12835 },
- { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12838 },
- { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12838 },
- { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12841 },
- { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12841 },
+ { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12846 },
+ { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12846 },
+ { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12846 },
+ { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12846 },
+ { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12849 },
+ { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12849 },
+ { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12852 },
+ { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12852 },
+ { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12855 },
+ { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12855 },
{ 0xfbdd, G_UNICODE_NOT_PRESENT_OFFSET, 1711 },
- { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12844 },
- { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12844 },
- { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12847 },
- { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12847 },
- { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12850 },
- { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12850 },
- { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12853 },
- { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12853 },
- { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12853 },
- { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12853 },
- { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12856 },
- { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12856 },
- { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12859 },
- { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12859 },
- { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12866 },
- { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12866 },
- { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12873 },
- { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12873 },
- { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12880 },
- { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12880 },
- { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12887 },
- { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12887 },
- { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12894 },
- { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12894 },
- { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12901 },
- { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12901 },
- { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12901 },
- { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
- { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
- { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
- { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
- { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
- { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
- { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
- { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12918 },
- { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12925 },
- { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
- { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
- { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12939 },
- { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
- { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12951 },
- { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12956 },
- { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12961 },
- { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12966 },
- { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12971 },
- { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12976 },
- { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12981 },
- { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 12986 },
- { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 12991 },
- { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 12996 },
- { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 13001 },
- { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 13006 },
- { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 13011 },
- { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 13016 },
- { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 13021 },
- { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 13026 },
- { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 13031 },
- { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 13036 },
- { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 13041 },
- { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 13046 },
- { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 13051 },
- { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 13056 },
- { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 13061 },
- { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 13066 },
- { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 13071 },
- { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 13076 },
- { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 13081 },
- { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 13086 },
- { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 13091 },
- { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 13096 },
- { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 13101 },
- { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 13106 },
- { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 13111 },
- { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 13116 },
- { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 13121 },
- { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 13126 },
- { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 13131 },
- { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 13136 },
- { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 13141 },
- { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 13146 },
- { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 13151 },
- { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 13156 },
- { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 13161 },
- { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 13166 },
- { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 13171 },
- { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 13176 },
- { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 13181 },
- { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 13186 },
- { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 13191 },
- { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 13196 },
- { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 13201 },
- { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 13206 },
- { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 13211 },
- { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 13216 },
- { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 13221 },
- { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 13226 },
- { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 13231 },
- { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 13236 },
- { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 13241 },
- { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 13246 },
- { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 13251 },
- { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 13256 },
- { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 13261 },
- { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 13266 },
- { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 13271 },
- { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 13276 },
- { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 13281 },
- { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 13286 },
- { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 13291 },
- { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 13296 },
- { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 13301 },
- { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 13306 },
- { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 13311 },
- { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 13316 },
- { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 13321 },
- { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 13326 },
- { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 13331 },
- { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 13336 },
- { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 13341 },
- { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 13346 },
- { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 13351 },
- { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 13356 },
- { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 13361 },
- { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 13366 },
- { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 13371 },
- { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 13376 },
- { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 13381 },
- { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 13386 },
- { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 13391 },
- { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 13397 },
- { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 13403 },
- { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 13409 },
- { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 13415 },
- { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 13421 },
- { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 13427 },
- { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 13434 },
- { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
- { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 13441 },
- { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
- { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12939 },
- { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 13448 },
- { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 13453 },
- { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12961 },
- { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 13458 },
- { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12966 },
- { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12971 },
- { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 13463 },
- { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 13468 },
- { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 12991 },
- { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 13473 },
- { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 12996 },
- { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 13001 },
- { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 13478 },
- { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 13483 },
- { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 13011 },
- { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 13488 },
- { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 13016 },
- { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 13021 },
- { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 13166 },
- { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 13171 },
- { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 13186 },
- { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 13191 },
- { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 13196 },
- { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 13216 },
- { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 13221 },
- { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 13226 },
- { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 13231 },
- { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 13251 },
- { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 13256 },
- { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 13261 },
- { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 13493 },
- { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 13281 },
- { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 13498 },
- { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 13503 },
- { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 13311 },
- { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 13508 },
- { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 13316 },
- { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 13321 },
- { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 13386 },
- { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 13513 },
- { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 13518 },
- { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 13361 },
- { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 13523 },
- { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 13366 },
- { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 13371 },
- { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12918 },
- { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12925 },
- { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 13528 },
- { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
- { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 13535 },
- { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
- { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12951 },
- { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12956 },
- { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12961 },
- { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 13542 },
- { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12976 },
- { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12981 },
- { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 12986 },
- { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 12991 },
- { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 13547 },
- { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 13011 },
- { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 13026 },
- { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 13031 },
- { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 13036 },
- { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 13041 },
- { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 13046 },
- { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 13056 },
- { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 13061 },
- { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 13066 },
- { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 13071 },
- { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 13076 },
- { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 13081 },
- { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 13552 },
- { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 13086 },
- { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 13091 },
- { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 13096 },
- { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 13101 },
- { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 13106 },
- { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 13111 },
- { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 13121 },
- { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 13126 },
- { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 13131 },
- { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 13136 },
- { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 13141 },
- { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 13146 },
- { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 13151 },
- { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 13156 },
- { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 13161 },
- { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 13176 },
- { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 13181 },
- { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 13201 },
- { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 13206 },
- { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 13211 },
- { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 13216 },
- { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 13221 },
- { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 13236 },
- { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 13241 },
- { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 13246 },
- { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 13251 },
- { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 13557 },
- { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 13266 },
- { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 13271 },
- { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 13276 },
- { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 13281 },
- { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 13296 },
- { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 13301 },
- { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 13306 },
- { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 13311 },
- { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 13562 },
- { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 13326 },
- { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 13331 },
- { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 13567 },
- { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 13346 },
- { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 13351 },
- { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 13356 },
- { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 13361 },
- { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 13572 },
- { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
- { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 13535 },
- { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12961 },
- { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 13542 },
- { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 12991 },
- { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 13547 },
- { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 13011 },
- { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 13577 },
- { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 13076 },
- { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 13582 },
- { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 13587 },
- { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 13592 },
- { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 13216 },
- { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 13221 },
- { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 13251 },
- { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 13311 },
- { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 13562 },
- { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 13361 },
- { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 13572 },
- { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 13597 },
- { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 13604 },
- { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 13611 },
- { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 13618 },
- { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 13623 },
- { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 13628 },
- { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 13633 },
- { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 13638 },
- { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 13643 },
- { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 13648 },
- { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 13653 },
- { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 13658 },
- { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 13663 },
- { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 13668 },
- { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 13673 },
- { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 13678 },
- { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 13683 },
- { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 13688 },
- { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 13693 },
- { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 13698 },
- { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 13703 },
- { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 13708 },
- { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 13713 },
- { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 13718 },
- { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 13723 },
- { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 13728 },
- { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 13587 },
- { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 13733 },
- { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 13738 },
- { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 13743 },
- { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13748 },
- { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 13618 },
- { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 13623 },
- { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 13628 },
- { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 13633 },
- { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 13638 },
- { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 13643 },
- { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 13648 },
- { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 13653 },
- { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 13658 },
- { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 13663 },
- { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 13668 },
- { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 13673 },
- { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 13678 },
- { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 13683 },
- { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 13688 },
- { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 13693 },
- { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 13698 },
- { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 13703 },
- { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 13708 },
- { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 13713 },
- { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 13718 },
- { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 13723 },
- { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 13728 },
- { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 13587 },
- { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 13733 },
- { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 13738 },
- { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 13743 },
- { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13748 },
- { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 13718 },
- { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 13723 },
- { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 13728 },
- { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 13587 },
- { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 13582 },
- { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 13592 },
- { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 13116 },
- { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 13061 },
- { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 13066 },
- { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 13071 },
- { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 13718 },
- { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 13723 },
- { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 13728 },
- { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 13116 },
- { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 13121 },
- { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13753 },
- { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13753 },
- { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13758 },
- { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13765 },
- { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13765 },
- { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13772 },
- { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13779 },
- { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13786 },
- { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13793 },
- { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13800 },
- { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13807 },
- { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13807 },
- { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13814 },
- { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13821 },
- { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13828 },
- { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13835 },
- { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13842 },
- { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13849 },
- { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13849 },
- { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13856 },
- { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13863 },
- { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13863 },
- { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13870 },
- { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13870 },
- { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13877 },
- { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13884 },
- { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13884 },
- { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13891 },
- { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13898 },
- { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13898 },
- { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13905 },
- { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13905 },
- { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13912 },
- { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13919 },
- { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13919 },
- { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13926 },
- { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13926 },
- { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13933 },
- { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13940 },
- { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13947 },
- { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13954 },
- { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13954 },
- { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13961 },
- { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13968 },
- { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13975 },
- { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13982 },
- { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 13989 },
- { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 13989 },
- { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 13996 },
- { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 14003 },
- { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 14010 },
- { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 14017 },
- { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 14024 },
- { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 14031 },
- { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 14031 },
- { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 14038 },
- { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 14038 },
- { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 14045 },
- { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 14045 },
- { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 14052 },
- { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 14059 },
- { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 14066 },
- { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 14073 },
- { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 14080 },
- { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 14087 },
- { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 14094 },
- { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 14101 },
- { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 14108 },
- { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 14115 },
- { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 14122 },
- { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 14129 },
- { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 14136 },
- { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 14136 },
- { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 14143 },
- { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 14150 },
- { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 14157 },
- { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 14164 },
- { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 14164 },
- { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 14171 },
- { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 14178 },
- { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 14185 },
- { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 14192 },
- { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 14199 },
- { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 14206 },
- { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 14213 },
- { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 14220 },
- { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 14227 },
- { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 14234 },
- { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 14241 },
- { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 14248 },
- { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 14255 },
- { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 14262 },
- { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 14269 },
- { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 14276 },
- { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 14283 },
- { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 14290 },
- { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 14297 },
- { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 14304 },
- { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 14311 },
- { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 14318 },
- { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 13996 },
- { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 14010 },
- { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 14325 },
- { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 14332 },
- { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 14339 },
- { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 14346 },
- { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 14353 },
- { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 14360 },
- { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 14353 },
- { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 14339 },
- { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 14367 },
- { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 14374 },
- { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 14381 },
- { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 14388 },
- { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 14395 },
- { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 14360 },
- { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13947 },
- { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13877 },
- { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 14402 },
- { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 14409 },
- { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 14416 },
- { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 14423 },
- { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 14430 },
- { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 14439 },
- { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 14448 },
- { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 14457 },
- { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 14466 },
- { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 14475 },
- { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 14484 },
- { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 14493 },
- { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 14500 },
- { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 14534 },
- { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 14550 },
- { 0xfe10, G_UNICODE_NOT_PRESENT_OFFSET, 14559 },
- { 0xfe11, G_UNICODE_NOT_PRESENT_OFFSET, 14561 },
- { 0xfe12, G_UNICODE_NOT_PRESENT_OFFSET, 14565 },
- { 0xfe13, G_UNICODE_NOT_PRESENT_OFFSET, 14569 },
+ { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12858 },
+ { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12858 },
+ { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12864 },
+ { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12864 },
+ { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12867 },
+ { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12867 },
+ { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12867 },
+ { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12867 },
+ { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12870 },
+ { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12870 },
+ { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12873 },
+ { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12873 },
+ { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12880 },
+ { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12880 },
+ { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12887 },
+ { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12887 },
+ { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12894 },
+ { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12894 },
+ { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12901 },
+ { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12901 },
+ { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
+ { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12908 },
+ { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
+ { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
+ { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12915 },
+ { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12929 },
+ { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12929 },
+ { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12929 },
+ { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12929 },
+ { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
+ { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12939 },
+ { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
+ { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12953 },
+ { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12960 },
+ { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12965 },
+ { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12970 },
+ { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12975 },
+ { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12980 },
+ { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12985 },
+ { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12990 },
+ { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12995 },
+ { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 13000 },
+ { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 13005 },
+ { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 13010 },
+ { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 13015 },
+ { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 13020 },
+ { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 13025 },
+ { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 13030 },
+ { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 13035 },
+ { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 13040 },
+ { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 13045 },
+ { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 13050 },
+ { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 13055 },
+ { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 13060 },
+ { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 13065 },
+ { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 13070 },
+ { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 13075 },
+ { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 13080 },
+ { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 13085 },
+ { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 13090 },
+ { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 13095 },
+ { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 13100 },
+ { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 13105 },
+ { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 13110 },
+ { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 13115 },
+ { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 13120 },
+ { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 13125 },
+ { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 13130 },
+ { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 13135 },
+ { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 13140 },
+ { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 13145 },
+ { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 13150 },
+ { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 13155 },
+ { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 13160 },
+ { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 13165 },
+ { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 13170 },
+ { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 13175 },
+ { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 13180 },
+ { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 13185 },
+ { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 13190 },
+ { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 13195 },
+ { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 13200 },
+ { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 13205 },
+ { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 13210 },
+ { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 13215 },
+ { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 13220 },
+ { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 13225 },
+ { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 13230 },
+ { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 13235 },
+ { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 13240 },
+ { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 13245 },
+ { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 13250 },
+ { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 13255 },
+ { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 13260 },
+ { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 13265 },
+ { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 13270 },
+ { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 13275 },
+ { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 13280 },
+ { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 13285 },
+ { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 13290 },
+ { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 13295 },
+ { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 13300 },
+ { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 13305 },
+ { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 13310 },
+ { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 13315 },
+ { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 13320 },
+ { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 13325 },
+ { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 13330 },
+ { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 13335 },
+ { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 13340 },
+ { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 13345 },
+ { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 13350 },
+ { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 13355 },
+ { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 13360 },
+ { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 13365 },
+ { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 13370 },
+ { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 13375 },
+ { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 13380 },
+ { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 13385 },
+ { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 13390 },
+ { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 13395 },
+ { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 13400 },
+ { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 13405 },
+ { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 13411 },
+ { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 13417 },
+ { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 13423 },
+ { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 13429 },
+ { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 13435 },
+ { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 13441 },
+ { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 13448 },
+ { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
+ { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 13455 },
+ { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12953 },
+ { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 13462 },
+ { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 13467 },
+ { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12975 },
+ { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 13472 },
+ { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12980 },
+ { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12985 },
+ { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 13477 },
+ { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 13482 },
+ { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 13005 },
+ { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 13487 },
+ { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 13010 },
+ { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 13015 },
+ { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 13492 },
+ { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 13497 },
+ { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 13025 },
+ { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 13502 },
+ { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 13030 },
+ { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 13035 },
+ { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 13180 },
+ { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 13185 },
+ { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 13200 },
+ { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 13205 },
+ { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 13210 },
+ { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 13230 },
+ { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 13235 },
+ { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 13240 },
+ { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 13245 },
+ { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 13265 },
+ { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 13270 },
+ { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 13275 },
+ { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 13507 },
+ { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 13295 },
+ { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 13512 },
+ { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 13517 },
+ { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 13325 },
+ { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 13522 },
+ { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 13330 },
+ { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 13335 },
+ { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 13400 },
+ { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 13527 },
+ { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 13532 },
+ { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 13375 },
+ { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 13537 },
+ { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 13380 },
+ { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 13385 },
+ { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
+ { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12939 },
+ { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 13542 },
+ { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
+ { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 13549 },
+ { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12960 },
+ { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12965 },
+ { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12970 },
+ { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12975 },
+ { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 13556 },
+ { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12990 },
+ { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12995 },
+ { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 13000 },
+ { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 13005 },
+ { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 13561 },
+ { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 13025 },
+ { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 13040 },
+ { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 13045 },
+ { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 13050 },
+ { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 13055 },
+ { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 13060 },
+ { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 13070 },
+ { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 13075 },
+ { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 13080 },
+ { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 13085 },
+ { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 13090 },
+ { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 13095 },
+ { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 13566 },
+ { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 13100 },
+ { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 13105 },
+ { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 13110 },
+ { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 13115 },
+ { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 13120 },
+ { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 13125 },
+ { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 13135 },
+ { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 13140 },
+ { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 13145 },
+ { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 13150 },
+ { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 13155 },
+ { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 13160 },
+ { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 13165 },
+ { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 13170 },
+ { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 13175 },
+ { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 13190 },
+ { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 13195 },
+ { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 13215 },
+ { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 13220 },
+ { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 13225 },
+ { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 13230 },
+ { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 13235 },
+ { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 13250 },
+ { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 13255 },
+ { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 13260 },
+ { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 13265 },
+ { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 13571 },
+ { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 13280 },
+ { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 13285 },
+ { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 13290 },
+ { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 13295 },
+ { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 13310 },
+ { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 13315 },
+ { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 13320 },
+ { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 13325 },
+ { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 13576 },
+ { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 13340 },
+ { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 13345 },
+ { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 13581 },
+ { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 13360 },
+ { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 13365 },
+ { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 13370 },
+ { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 13375 },
+ { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 13586 },
+ { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12946 },
+ { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 13549 },
+ { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12975 },
+ { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 13556 },
+ { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 13005 },
+ { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 13561 },
+ { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 13025 },
+ { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 13591 },
+ { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 13090 },
+ { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 13596 },
+ { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 13601 },
+ { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 13606 },
+ { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 13230 },
+ { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 13235 },
+ { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 13265 },
+ { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 13325 },
+ { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 13576 },
+ { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 13375 },
+ { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 13586 },
+ { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 13611 },
+ { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 13618 },
+ { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 13625 },
+ { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 13632 },
+ { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 13637 },
+ { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 13642 },
+ { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 13647 },
+ { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 13652 },
+ { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 13657 },
+ { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 13662 },
+ { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 13667 },
+ { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 13672 },
+ { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 13677 },
+ { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 13682 },
+ { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 13687 },
+ { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 13692 },
+ { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 13697 },
+ { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 13702 },
+ { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 13707 },
+ { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 13712 },
+ { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 13717 },
+ { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 13722 },
+ { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 13727 },
+ { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 13732 },
+ { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 13737 },
+ { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 13742 },
+ { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 13601 },
+ { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 13747 },
+ { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 13752 },
+ { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 13757 },
+ { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13762 },
+ { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 13632 },
+ { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 13637 },
+ { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 13642 },
+ { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 13647 },
+ { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 13652 },
+ { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 13657 },
+ { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 13662 },
+ { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 13667 },
+ { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 13672 },
+ { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 13677 },
+ { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 13682 },
+ { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 13687 },
+ { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 13692 },
+ { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 13697 },
+ { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 13702 },
+ { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 13707 },
+ { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 13712 },
+ { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 13717 },
+ { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 13722 },
+ { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 13727 },
+ { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 13732 },
+ { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 13737 },
+ { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 13742 },
+ { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 13601 },
+ { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 13747 },
+ { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 13752 },
+ { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 13757 },
+ { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13762 },
+ { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 13732 },
+ { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 13737 },
+ { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 13742 },
+ { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 13601 },
+ { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 13596 },
+ { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 13606 },
+ { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 13130 },
+ { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 13075 },
+ { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 13080 },
+ { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 13085 },
+ { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 13732 },
+ { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 13737 },
+ { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 13742 },
+ { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 13130 },
+ { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 13135 },
+ { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13767 },
+ { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13767 },
+ { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13772 },
+ { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13779 },
+ { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13779 },
+ { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13786 },
+ { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13793 },
+ { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13800 },
+ { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13807 },
+ { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13814 },
+ { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13821 },
+ { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13821 },
+ { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13828 },
+ { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13835 },
+ { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13842 },
+ { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13849 },
+ { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13856 },
+ { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13863 },
+ { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13863 },
+ { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13870 },
+ { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13877 },
+ { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13877 },
+ { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13884 },
+ { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13884 },
+ { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13891 },
+ { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13898 },
+ { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13898 },
+ { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13905 },
+ { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13912 },
+ { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13912 },
+ { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13919 },
+ { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13919 },
+ { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13926 },
+ { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13933 },
+ { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13933 },
+ { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13940 },
+ { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13940 },
+ { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13947 },
+ { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13954 },
+ { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13961 },
+ { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13968 },
+ { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13968 },
+ { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13975 },
+ { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13982 },
+ { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13989 },
+ { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13996 },
+ { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 14003 },
+ { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 14003 },
+ { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 14010 },
+ { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 14017 },
+ { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 14024 },
+ { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 14031 },
+ { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 14038 },
+ { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 14045 },
+ { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 14045 },
+ { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 14052 },
+ { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 14052 },
+ { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 14059 },
+ { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 14059 },
+ { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 14066 },
+ { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 14073 },
+ { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 14080 },
+ { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 14087 },
+ { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 14094 },
+ { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 14101 },
+ { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 14108 },
+ { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 14115 },
+ { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 14122 },
+ { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 14129 },
+ { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 14136 },
+ { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 14143 },
+ { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 14150 },
+ { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 14150 },
+ { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 14157 },
+ { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 14164 },
+ { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 14171 },
+ { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 14178 },
+ { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 14178 },
+ { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 14185 },
+ { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 14192 },
+ { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 14199 },
+ { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 14206 },
+ { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 14213 },
+ { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 14220 },
+ { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 14227 },
+ { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 14234 },
+ { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 14241 },
+ { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 14248 },
+ { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 14255 },
+ { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 14262 },
+ { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 14269 },
+ { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 14276 },
+ { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 14283 },
+ { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 14290 },
+ { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 14297 },
+ { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 14304 },
+ { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 14311 },
+ { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 14318 },
+ { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 14325 },
+ { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 14332 },
+ { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 14010 },
+ { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 14024 },
+ { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 14339 },
+ { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 14346 },
+ { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 14353 },
+ { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 14360 },
+ { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 14367 },
+ { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 14374 },
+ { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 14367 },
+ { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 14353 },
+ { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 14381 },
+ { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 14388 },
+ { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 14395 },
+ { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 14402 },
+ { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 14409 },
+ { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 14374 },
+ { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13961 },
+ { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13891 },
+ { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 14416 },
+ { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 14423 },
+ { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 14430 },
+ { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 14437 },
+ { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 14444 },
+ { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 14453 },
+ { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 14462 },
+ { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 14471 },
+ { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 14480 },
+ { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 14489 },
+ { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 14498 },
+ { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 14507 },
+ { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 14514 },
+ { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 14548 },
+ { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 14564 },
+ { 0xfe10, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
+ { 0xfe11, G_UNICODE_NOT_PRESENT_OFFSET, 14575 },
+ { 0xfe12, G_UNICODE_NOT_PRESENT_OFFSET, 14579 },
+ { 0xfe13, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
{ 0xfe14, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
- { 0xfe15, G_UNICODE_NOT_PRESENT_OFFSET, 14571 },
- { 0xfe16, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
- { 0xfe17, G_UNICODE_NOT_PRESENT_OFFSET, 14575 },
- { 0xfe18, G_UNICODE_NOT_PRESENT_OFFSET, 14579 },
+ { 0xfe15, G_UNICODE_NOT_PRESENT_OFFSET, 14585 },
+ { 0xfe16, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
+ { 0xfe17, G_UNICODE_NOT_PRESENT_OFFSET, 14589 },
+ { 0xfe18, G_UNICODE_NOT_PRESENT_OFFSET, 14593 },
{ 0xfe19, G_UNICODE_NOT_PRESENT_OFFSET, 5186 },
{ 0xfe30, G_UNICODE_NOT_PRESENT_OFFSET, 5183 },
- { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
- { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
- { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
- { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
+ { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
+ { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 14601 },
+ { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
{ 0xfe35, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
{ 0xfe36, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
- { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 14593 },
- { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 14595 },
- { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
- { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 14601 },
- { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
- { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 14609 },
- { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 14613 },
- { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 14617 },
+ { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 14607 },
+ { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 14609 },
+ { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 14611 },
+ { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 14615 },
+ { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 14619 },
+ { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 14623 },
+ { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 14627 },
+ { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 14631 },
{ 0xfe3f, G_UNICODE_NOT_PRESENT_OFFSET, 5826 },
{ 0xfe40, G_UNICODE_NOT_PRESENT_OFFSET, 5830 },
- { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 14621 },
- { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 14625 },
- { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 14629 },
- { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 14633 },
- { 0xfe47, G_UNICODE_NOT_PRESENT_OFFSET, 14637 },
- { 0xfe48, G_UNICODE_NOT_PRESENT_OFFSET, 14639 },
+ { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 14635 },
+ { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 14639 },
+ { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 14643 },
+ { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 14647 },
+ { 0xfe47, G_UNICODE_NOT_PRESENT_OFFSET, 14651 },
+ { 0xfe48, G_UNICODE_NOT_PRESENT_OFFSET, 14653 },
{ 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, 14591 },
- { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
- { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
- { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 14559 },
- { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 14561 },
+ { 0xfe4d, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
+ { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 14575 },
{ 0xfe52, G_UNICODE_NOT_PRESENT_OFFSET, 5181 },
{ 0xfe54, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
- { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 14569 },
- { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
- { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 14571 },
- { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
+ { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
+ { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
+ { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 14585 },
+ { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
{ 0xfe59, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
{ 0xfe5a, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
- { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 14593 },
- { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 14595 },
- { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
- { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 14601 },
- { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 14641 },
- { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 14643 },
- { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 14645 },
+ { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 14607 },
+ { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 14609 },
+ { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 14611 },
+ { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 14615 },
+ { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 14655 },
+ { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 14657 },
+ { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 14659 },
{ 0xfe62, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
- { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 14647 },
- { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 14649 },
- { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 14651 },
+ { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 14661 },
+ { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 14663 },
+ { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 14665 },
{ 0xfe66, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
- { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 14653 },
- { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 14655 },
- { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 14657 },
- { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 14659 },
- { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 14661 },
- { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 14665 },
- { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 14670 },
- { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 14674 },
- { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 14678 },
- { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 14682 },
- { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 14687 },
- { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 14691 },
- { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 14696 },
- { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 14700 },
- { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 14705 },
- { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 14709 },
- { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
- { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 14718 },
- { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 14667 },
+ { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 14669 },
+ { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 14671 },
+ { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 14673 },
+ { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 14675 },
+ { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 14679 },
+ { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 14684 },
+ { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 14688 },
+ { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 14692 },
+ { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 14696 },
+ { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 14701 },
+ { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 14705 },
+ { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 14710 },
+ { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
+ { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 14719 },
+ { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 14728 },
+ { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
+ { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 14737 },
{ 0xfe81, G_UNICODE_NOT_PRESENT_OFFSET, 1676 },
{ 0xfe82, G_UNICODE_NOT_PRESENT_OFFSET, 1676 },
{ 0xfe83, G_UNICODE_NOT_PRESENT_OFFSET, 1681 },
@@ -5606,133 +5637,133 @@ static const decomposition decomp_table[] =
{ 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, 14726 },
- { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 14726 },
- { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
- { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
- { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
- { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
- { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
- { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
- { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
- { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
- { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
- { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
- { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
- { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
- { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
- { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
- { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
- { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
- { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
- { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
- { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
- { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
- { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
- { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
- { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
- { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
- { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
- { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
- { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
- { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
- { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 14753 },
- { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 14753 },
- { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
- { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
- { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14759 },
- { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14759 },
- { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14762 },
- { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14762 },
- { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14762 },
- { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14762 },
- { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14765 },
- { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14765 },
- { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14765 },
- { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14765 },
- { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14768 },
- { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14768 },
- { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14768 },
- { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14768 },
- { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14771 },
- { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14771 },
- { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14771 },
- { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14771 },
- { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14774 },
- { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14774 },
- { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14774 },
- { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14774 },
- { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14777 },
- { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14777 },
- { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14777 },
- { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14777 },
- { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
- { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
- { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
- { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
- { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14783 },
- { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14783 },
- { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14783 },
- { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14783 },
- { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14786 },
- { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14786 },
- { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14786 },
- { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14786 },
- { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14789 },
- { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14789 },
- { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14789 },
- { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14789 },
- { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14792 },
- { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14792 },
- { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14792 },
- { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14792 },
- { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14795 },
- { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14795 },
- { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14795 },
- { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14795 },
- { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14798 },
- { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14798 },
- { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14798 },
- { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14798 },
- { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14801 },
- { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14801 },
- { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14801 },
- { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14801 },
- { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14804 },
- { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14804 },
- { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14804 },
- { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14804 },
- { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14807 },
- { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14807 },
- { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12856 },
- { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12856 },
- { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14810 },
- { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14810 },
- { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14810 },
- { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14810 },
- { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14813 },
- { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14813 },
- { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14820 },
- { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14820 },
- { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14827 },
- { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14827 },
- { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14834 },
- { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14834 },
- { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 14571 },
- { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14839 },
- { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 14641 },
- { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 14655 },
- { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 14657 },
- { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 14643 },
- { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14841 },
+ { 0xfe8d, G_UNICODE_NOT_PRESENT_OFFSET, 14740 },
+ { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 14740 },
+ { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 14746 },
+ { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 14746 },
+ { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 14764 },
+ { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 14764 },
+ { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 14767 },
+ { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 14767 },
+ { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 14770 },
+ { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 14770 },
+ { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12870 },
+ { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12870 },
+ { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14827 },
+ { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14827 },
+ { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14834 },
+ { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14834 },
+ { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14841 },
+ { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14841 },
+ { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14848 },
+ { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14848 },
+ { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 14585 },
+ { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14853 },
+ { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 14655 },
+ { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 14669 },
+ { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 14671 },
+ { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 14657 },
+ { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14855 },
{ 0xff08, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
{ 0xff09, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
- { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 14645 },
+ { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 14659 },
{ 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
- { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 14559 },
- { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 14647 },
+ { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
+ { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 14661 },
{ 0xff0e, G_UNICODE_NOT_PRESENT_OFFSET, 5181 },
- { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14843 },
+ { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14857 },
{ 0xff10, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
{ 0xff11, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
{ 0xff12, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
@@ -5743,13 +5774,13 @@ static const decomposition decomp_table[] =
{ 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, 14569 },
+ { 0xff1a, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
{ 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
- { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14649 },
+ { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14663 },
{ 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
- { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 14651 },
- { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 14573 },
- { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 14659 },
+ { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 14665 },
+ { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
+ { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 14673 },
{ 0xff21, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
{ 0xff22, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
{ 0xff23, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
@@ -5776,11 +5807,11 @@ static const decomposition decomp_table[] =
{ 0xff38, G_UNICODE_NOT_PRESENT_OFFSET, 5487 },
{ 0xff39, G_UNICODE_NOT_PRESENT_OFFSET, 6135 },
{ 0xff3a, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
- { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14637 },
- { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 14653 },
- { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14639 },
- { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14845 },
- { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
+ { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14651 },
+ { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 14667 },
+ { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14653 },
+ { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14859 },
+ { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
{ 0xff40, G_UNICODE_NOT_PRESENT_OFFSET, 5110 },
{ 0xff41, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
{ 0xff42, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
@@ -5808,28 +5839,28 @@ static const decomposition decomp_table[] =
{ 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, 14593 },
- { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14847 },
- { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 14595 },
- { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14849 },
- { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14851 },
- { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14855 },
- { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14565 },
- { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 14621 },
- { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 14625 },
- { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 14561 },
- { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14859 },
+ { 0xff5b, G_UNICODE_NOT_PRESENT_OFFSET, 14607 },
+ { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14861 },
+ { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 14609 },
+ { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14863 },
+ { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14865 },
+ { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14869 },
+ { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14579 },
+ { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 14635 },
+ { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 14639 },
+ { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 14575 },
+ { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14873 },
{ 0xff66, G_UNICODE_NOT_PRESENT_OFFSET, 8992 },
- { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14863 },
- { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14867 },
- { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14871 },
- { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14875 },
- { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14879 },
- { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14883 },
- { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14887 },
- { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14891 },
- { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14895 },
- { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14899 },
+ { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14877 },
+ { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14881 },
+ { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14885 },
+ { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14889 },
+ { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14893 },
+ { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14897 },
+ { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14901 },
+ { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14905 },
+ { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14909 },
+ { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14913 },
{ 0xff71, G_UNICODE_NOT_PRESENT_OFFSET, 8808 },
{ 0xff72, G_UNICODE_NOT_PRESENT_OFFSET, 8812 },
{ 0xff73, G_UNICODE_NOT_PRESENT_OFFSET, 8816 },
@@ -5874,9 +5905,9 @@ static const decomposition decomp_table[] =
{ 0xff9a, G_UNICODE_NOT_PRESENT_OFFSET, 8972 },
{ 0xff9b, G_UNICODE_NOT_PRESENT_OFFSET, 8976 },
{ 0xff9c, G_UNICODE_NOT_PRESENT_OFFSET, 8980 },
- { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14903 },
- { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14907 },
- { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14911 },
+ { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14917 },
+ { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14921 },
+ { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14925 },
{ 0xffa0, G_UNICODE_NOT_PRESENT_OFFSET, 7683 },
{ 0xffa1, G_UNICODE_NOT_PRESENT_OFFSET, 7479 },
{ 0xffa2, G_UNICODE_NOT_PRESENT_OFFSET, 7483 },
@@ -5929,36 +5960,38 @@ static const decomposition decomp_table[] =
{ 0xffda, G_UNICODE_NOT_PRESENT_OFFSET, 7671 },
{ 0xffdb, G_UNICODE_NOT_PRESENT_OFFSET, 7675 },
{ 0xffdc, G_UNICODE_NOT_PRESENT_OFFSET, 7679 },
- { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14915 },
- { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14918 },
- { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14921 },
+ { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14929 },
+ { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14932 },
+ { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14935 },
{ 0xffe3, G_UNICODE_NOT_PRESENT_OFFSET, 8 },
- { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14924 },
- { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14927 },
- { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14930 },
- { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14934 },
- { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14938 },
- { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14942 },
- { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14946 },
- { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14950 },
- { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14954 },
- { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14958 },
- { 0x1109a, 14962, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1109c, 14971, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x110ab, 14980, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d15e, 14989, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d15f, 14998, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d160, 15007, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d161, 15020, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d162, 15033, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d163, 15046, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d164, 15059, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1bb, 15072, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1bc, 15081, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1bd, 15090, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1be, 15103, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1bf, 15116, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x1d1c0, 15129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14938 },
+ { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14941 },
+ { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14944 },
+ { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14948 },
+ { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14952 },
+ { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14956 },
+ { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14960 },
+ { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14964 },
+ { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14968 },
+ { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14972 },
+ { 0x1109a, 14976, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1109c, 14985, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x110ab, 14994, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1112e, 15003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1112f, 15012, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d15e, 15021, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d15f, 15030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d160, 15039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d161, 15052, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d162, 15065, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d163, 15078, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d164, 15091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bb, 15104, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bc, 15113, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bd, 15122, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1be, 15135, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bf, 15148, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1c0, 15161, 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 },
@@ -6611,300 +6644,300 @@ static const decomposition decomp_table[] =
{ 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, 15142 },
- { 0x1d6a5, G_UNICODE_NOT_PRESENT_OFFSET, 15145 },
- { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 15148 },
- { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 15151 },
+ { 0x1d6a4, G_UNICODE_NOT_PRESENT_OFFSET, 15174 },
+ { 0x1d6a5, G_UNICODE_NOT_PRESENT_OFFSET, 15177 },
+ { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 15180 },
+ { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 15183 },
{ 0x1d6aa, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
- { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 15154 },
- { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 15157 },
- { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 15160 },
- { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 15163 },
+ { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 15186 },
+ { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 15189 },
+ { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 15192 },
+ { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 15195 },
{ 0x1d6af, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
- { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 15166 },
- { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 15169 },
- { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 15172 },
- { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 15175 },
- { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 15178 },
- { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 15181 },
- { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 15184 },
+ { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 15198 },
+ { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 15201 },
+ { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 15204 },
+ { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 15207 },
+ { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 15210 },
+ { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 15213 },
+ { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 15216 },
{ 0x1d6b7, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
- { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 15187 },
+ { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 15219 },
{ 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
{ 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
- { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15190 },
+ { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15222 },
{ 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
- { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 15193 },
- { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 15196 },
- { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 15199 },
+ { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 15225 },
+ { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 15228 },
+ { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 15231 },
{ 0x1d6c0, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
- { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 15202 },
- { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 15206 },
+ { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 15234 },
+ { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 15238 },
{ 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, 15209 },
- { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 15212 },
+ { 0x1d6c7, G_UNICODE_NOT_PRESENT_OFFSET, 15241 },
+ { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 15244 },
{ 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, 15215 },
+ { 0x1d6cc, G_UNICODE_NOT_PRESENT_OFFSET, 15247 },
{ 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
- { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 15218 },
- { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 15221 },
- { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 15224 },
+ { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 15250 },
+ { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 15253 },
+ { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 15256 },
{ 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, 15227 },
- { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 15230 },
- { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 15233 },
+ { 0x1d6d4, G_UNICODE_NOT_PRESENT_OFFSET, 15259 },
+ { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 15262 },
+ { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 15265 },
{ 0x1d6d7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
{ 0x1d6d8, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
- { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 15236 },
- { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 15239 },
- { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 15242 },
+ { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 15268 },
+ { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 15271 },
+ { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 15274 },
{ 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, 15148 },
- { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15151 },
+ { 0x1d6e2, G_UNICODE_NOT_PRESENT_OFFSET, 15180 },
+ { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15183 },
{ 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
- { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 15154 },
- { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 15157 },
- { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 15160 },
- { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 15163 },
+ { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 15186 },
+ { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 15189 },
+ { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 15192 },
+ { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 15195 },
{ 0x1d6e9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
- { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 15166 },
- { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 15169 },
- { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 15172 },
- { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 15175 },
- { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 15178 },
- { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 15181 },
- { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 15184 },
+ { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 15198 },
+ { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 15201 },
+ { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 15204 },
+ { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 15207 },
+ { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 15210 },
+ { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 15213 },
+ { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 15216 },
{ 0x1d6f1, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
- { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 15187 },
+ { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 15219 },
{ 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
{ 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
- { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15190 },
+ { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15222 },
{ 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
- { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 15193 },
- { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 15196 },
- { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 15199 },
+ { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 15225 },
+ { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 15228 },
+ { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 15231 },
{ 0x1d6fa, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
- { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 15202 },
- { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 15206 },
+ { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 15234 },
+ { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 15238 },
{ 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, 15209 },
- { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 15212 },
+ { 0x1d701, G_UNICODE_NOT_PRESENT_OFFSET, 15241 },
+ { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 15244 },
{ 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, 15215 },
+ { 0x1d706, G_UNICODE_NOT_PRESENT_OFFSET, 15247 },
{ 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
- { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 15218 },
- { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 15221 },
- { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 15224 },
+ { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 15250 },
+ { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 15253 },
+ { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 15256 },
{ 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, 15227 },
- { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 15230 },
- { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 15233 },
+ { 0x1d70e, G_UNICODE_NOT_PRESENT_OFFSET, 15259 },
+ { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 15262 },
+ { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 15265 },
{ 0x1d711, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
{ 0x1d712, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
- { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 15236 },
- { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 15239 },
- { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 15242 },
+ { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 15268 },
+ { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 15271 },
+ { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 15274 },
{ 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, 15148 },
- { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15151 },
+ { 0x1d71c, G_UNICODE_NOT_PRESENT_OFFSET, 15180 },
+ { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15183 },
{ 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
- { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 15154 },
- { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 15157 },
- { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 15160 },
- { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 15163 },
+ { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 15186 },
+ { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 15189 },
+ { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 15192 },
+ { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 15195 },
{ 0x1d723, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
- { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 15166 },
- { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 15169 },
- { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 15172 },
- { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 15175 },
- { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 15178 },
- { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 15181 },
- { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 15184 },
+ { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 15198 },
+ { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 15201 },
+ { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 15204 },
+ { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 15207 },
+ { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 15210 },
+ { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 15213 },
+ { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 15216 },
{ 0x1d72b, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
- { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 15187 },
+ { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 15219 },
{ 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
{ 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
- { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15190 },
+ { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15222 },
{ 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
- { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 15193 },
- { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 15196 },
- { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 15199 },
+ { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 15225 },
+ { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 15228 },
+ { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 15231 },
{ 0x1d734, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
- { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 15202 },
- { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 15206 },
+ { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 15234 },
+ { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 15238 },
{ 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, 15209 },
- { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 15212 },
+ { 0x1d73b, G_UNICODE_NOT_PRESENT_OFFSET, 15241 },
+ { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 15244 },
{ 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, 15215 },
+ { 0x1d740, G_UNICODE_NOT_PRESENT_OFFSET, 15247 },
{ 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
- { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 15218 },
- { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 15221 },
- { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 15224 },
+ { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 15250 },
+ { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 15253 },
+ { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 15256 },
{ 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, 15227 },
- { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 15230 },
- { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 15233 },
+ { 0x1d748, G_UNICODE_NOT_PRESENT_OFFSET, 15259 },
+ { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 15262 },
+ { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 15265 },
{ 0x1d74b, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
{ 0x1d74c, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
- { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 15236 },
- { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 15239 },
- { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 15242 },
+ { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 15268 },
+ { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 15271 },
+ { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 15274 },
{ 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, 15148 },
- { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15151 },
+ { 0x1d756, G_UNICODE_NOT_PRESENT_OFFSET, 15180 },
+ { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15183 },
{ 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
- { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 15154 },
- { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 15157 },
- { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 15160 },
- { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 15163 },
+ { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 15186 },
+ { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 15189 },
+ { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 15192 },
+ { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 15195 },
{ 0x1d75d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
- { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 15166 },
- { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 15169 },
- { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 15172 },
- { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 15175 },
- { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 15178 },
- { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 15181 },
- { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 15184 },
+ { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 15198 },
+ { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 15201 },
+ { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 15204 },
+ { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 15207 },
+ { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 15210 },
+ { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 15213 },
+ { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 15216 },
{ 0x1d765, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
- { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 15187 },
+ { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 15219 },
{ 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
{ 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
- { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15190 },
+ { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15222 },
{ 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
- { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 15193 },
- { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 15196 },
- { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 15199 },
+ { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 15225 },
+ { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 15228 },
+ { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 15231 },
{ 0x1d76e, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
- { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 15202 },
- { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 15206 },
+ { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 15234 },
+ { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 15238 },
{ 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, 15209 },
- { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 15212 },
+ { 0x1d775, G_UNICODE_NOT_PRESENT_OFFSET, 15241 },
+ { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 15244 },
{ 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, 15215 },
+ { 0x1d77a, G_UNICODE_NOT_PRESENT_OFFSET, 15247 },
{ 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
- { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 15218 },
- { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 15221 },
- { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 15224 },
+ { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 15250 },
+ { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 15253 },
+ { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 15256 },
{ 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, 15227 },
- { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 15230 },
- { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 15233 },
+ { 0x1d782, G_UNICODE_NOT_PRESENT_OFFSET, 15259 },
+ { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 15262 },
+ { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 15265 },
{ 0x1d785, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
{ 0x1d786, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
- { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 15236 },
- { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 15239 },
- { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 15242 },
+ { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 15268 },
+ { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 15271 },
+ { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 15274 },
{ 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, 15148 },
- { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15151 },
+ { 0x1d790, G_UNICODE_NOT_PRESENT_OFFSET, 15180 },
+ { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15183 },
{ 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
- { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 15154 },
- { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 15157 },
- { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 15160 },
- { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 15163 },
+ { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 15186 },
+ { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 15189 },
+ { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 15192 },
+ { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 15195 },
{ 0x1d797, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
- { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 15166 },
- { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 15169 },
- { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 15172 },
- { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 15175 },
- { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 15178 },
- { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 15181 },
- { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 15184 },
+ { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 15198 },
+ { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 15201 },
+ { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 15204 },
+ { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 15207 },
+ { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 15210 },
+ { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 15213 },
+ { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 15216 },
{ 0x1d79f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
- { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 15187 },
+ { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 15219 },
{ 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
{ 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
- { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15190 },
+ { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15222 },
{ 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
- { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 15193 },
- { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 15196 },
- { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 15199 },
+ { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 15225 },
+ { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 15228 },
+ { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 15231 },
{ 0x1d7a8, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
- { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 15202 },
- { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 15206 },
+ { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 15234 },
+ { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 15238 },
{ 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, 15209 },
- { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 15212 },
+ { 0x1d7af, G_UNICODE_NOT_PRESENT_OFFSET, 15241 },
+ { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 15244 },
{ 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, 15215 },
+ { 0x1d7b4, G_UNICODE_NOT_PRESENT_OFFSET, 15247 },
{ 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
- { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 15218 },
- { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 15221 },
- { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 15224 },
+ { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 15250 },
+ { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 15253 },
+ { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 15256 },
{ 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, 15227 },
- { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 15230 },
- { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 15233 },
+ { 0x1d7bc, G_UNICODE_NOT_PRESENT_OFFSET, 15259 },
+ { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 15262 },
+ { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 15265 },
{ 0x1d7bf, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
{ 0x1d7c0, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
- { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 15236 },
- { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 15239 },
- { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 15242 },
+ { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 15268 },
+ { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 15271 },
+ { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 15274 },
{ 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, 15246 },
- { 0x1d7cb, G_UNICODE_NOT_PRESENT_OFFSET, 15249 },
+ { 0x1d7ca, G_UNICODE_NOT_PRESENT_OFFSET, 15278 },
+ { 0x1d7cb, G_UNICODE_NOT_PRESENT_OFFSET, 15281 },
{ 0x1d7ce, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
{ 0x1d7cf, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
{ 0x1d7d0, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
@@ -6955,48 +6988,189 @@ static const decomposition decomp_table[] =
{ 0x1d7fd, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
{ 0x1d7fe, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
{ 0x1d7ff, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
- { 0x1f100, G_UNICODE_NOT_PRESENT_OFFSET, 15252 },
- { 0x1f101, G_UNICODE_NOT_PRESENT_OFFSET, 15255 },
- { 0x1f102, G_UNICODE_NOT_PRESENT_OFFSET, 15258 },
- { 0x1f103, G_UNICODE_NOT_PRESENT_OFFSET, 15261 },
- { 0x1f104, G_UNICODE_NOT_PRESENT_OFFSET, 15264 },
- { 0x1f105, G_UNICODE_NOT_PRESENT_OFFSET, 15267 },
- { 0x1f106, G_UNICODE_NOT_PRESENT_OFFSET, 15270 },
- { 0x1f107, G_UNICODE_NOT_PRESENT_OFFSET, 15273 },
- { 0x1f108, G_UNICODE_NOT_PRESENT_OFFSET, 15276 },
- { 0x1f109, G_UNICODE_NOT_PRESENT_OFFSET, 15279 },
- { 0x1f10a, G_UNICODE_NOT_PRESENT_OFFSET, 15282 },
- { 0x1f110, G_UNICODE_NOT_PRESENT_OFFSET, 15285 },
- { 0x1f111, G_UNICODE_NOT_PRESENT_OFFSET, 15289 },
- { 0x1f112, G_UNICODE_NOT_PRESENT_OFFSET, 15293 },
- { 0x1f113, G_UNICODE_NOT_PRESENT_OFFSET, 15297 },
- { 0x1f114, G_UNICODE_NOT_PRESENT_OFFSET, 15301 },
- { 0x1f115, G_UNICODE_NOT_PRESENT_OFFSET, 15305 },
- { 0x1f116, G_UNICODE_NOT_PRESENT_OFFSET, 15309 },
- { 0x1f117, G_UNICODE_NOT_PRESENT_OFFSET, 15313 },
- { 0x1f118, G_UNICODE_NOT_PRESENT_OFFSET, 15317 },
- { 0x1f119, G_UNICODE_NOT_PRESENT_OFFSET, 15321 },
- { 0x1f11a, G_UNICODE_NOT_PRESENT_OFFSET, 15325 },
- { 0x1f11b, G_UNICODE_NOT_PRESENT_OFFSET, 15329 },
- { 0x1f11c, G_UNICODE_NOT_PRESENT_OFFSET, 15333 },
- { 0x1f11d, G_UNICODE_NOT_PRESENT_OFFSET, 15337 },
- { 0x1f11e, G_UNICODE_NOT_PRESENT_OFFSET, 15341 },
- { 0x1f11f, G_UNICODE_NOT_PRESENT_OFFSET, 15345 },
- { 0x1f120, G_UNICODE_NOT_PRESENT_OFFSET, 15349 },
- { 0x1f121, G_UNICODE_NOT_PRESENT_OFFSET, 15353 },
- { 0x1f122, G_UNICODE_NOT_PRESENT_OFFSET, 15357 },
- { 0x1f123, G_UNICODE_NOT_PRESENT_OFFSET, 15361 },
- { 0x1f124, G_UNICODE_NOT_PRESENT_OFFSET, 15365 },
- { 0x1f125, G_UNICODE_NOT_PRESENT_OFFSET, 15369 },
- { 0x1f126, G_UNICODE_NOT_PRESENT_OFFSET, 15373 },
- { 0x1f127, G_UNICODE_NOT_PRESENT_OFFSET, 15377 },
- { 0x1f128, G_UNICODE_NOT_PRESENT_OFFSET, 15381 },
- { 0x1f129, G_UNICODE_NOT_PRESENT_OFFSET, 15385 },
- { 0x1f12a, G_UNICODE_NOT_PRESENT_OFFSET, 15389 },
+ { 0x1ee00, G_UNICODE_NOT_PRESENT_OFFSET, 14740 },
+ { 0x1ee01, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0x1ee02, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1ee03, G_UNICODE_NOT_PRESENT_OFFSET, 14764 },
+ { 0x1ee05, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0x1ee06, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0x1ee07, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1ee08, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0x1ee09, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1ee0a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0x1ee0b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0x1ee0c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0x1ee0d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1ee0e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1ee0f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1ee10, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0x1ee11, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1ee12, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1ee13, G_UNICODE_NOT_PRESENT_OFFSET, 14770 },
+ { 0x1ee14, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1ee15, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0x1ee16, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0x1ee17, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1ee18, G_UNICODE_NOT_PRESENT_OFFSET, 14767 },
+ { 0x1ee19, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1ee1a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0x1ee1b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1ee1c, G_UNICODE_NOT_PRESENT_OFFSET, 15284 },
+ { 0x1ee1d, G_UNICODE_NOT_PRESENT_OFFSET, 12831 },
+ { 0x1ee1e, G_UNICODE_NOT_PRESENT_OFFSET, 15287 },
+ { 0x1ee1f, G_UNICODE_NOT_PRESENT_OFFSET, 15290 },
+ { 0x1ee21, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0x1ee22, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1ee24, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0x1ee27, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1ee29, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1ee2a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0x1ee2b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0x1ee2c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0x1ee2d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1ee2e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1ee2f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1ee30, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0x1ee31, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1ee32, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1ee34, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1ee35, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0x1ee36, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0x1ee37, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1ee39, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1ee3b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1ee42, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1ee47, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1ee49, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1ee4b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0x1ee4d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1ee4e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1ee4f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1ee51, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1ee52, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1ee54, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1ee57, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1ee59, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1ee5b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1ee5d, G_UNICODE_NOT_PRESENT_OFFSET, 12831 },
+ { 0x1ee5f, G_UNICODE_NOT_PRESENT_OFFSET, 15290 },
+ { 0x1ee61, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0x1ee62, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1ee64, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0x1ee67, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1ee68, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0x1ee69, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1ee6a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 },
+ { 0x1ee6c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0x1ee6d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1ee6e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1ee6f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1ee70, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0x1ee71, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1ee72, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1ee74, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1ee75, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0x1ee76, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0x1ee77, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1ee79, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1ee7a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0x1ee7b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1ee7c, G_UNICODE_NOT_PRESENT_OFFSET, 15284 },
+ { 0x1ee7e, G_UNICODE_NOT_PRESENT_OFFSET, 15287 },
+ { 0x1ee80, G_UNICODE_NOT_PRESENT_OFFSET, 14740 },
+ { 0x1ee81, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0x1ee82, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1ee83, G_UNICODE_NOT_PRESENT_OFFSET, 14764 },
+ { 0x1ee84, G_UNICODE_NOT_PRESENT_OFFSET, 14818 },
+ { 0x1ee85, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0x1ee86, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0x1ee87, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1ee88, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0x1ee89, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1ee8b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0x1ee8c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0x1ee8d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1ee8e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1ee8f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1ee90, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0x1ee91, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1ee92, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1ee93, G_UNICODE_NOT_PRESENT_OFFSET, 14770 },
+ { 0x1ee94, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1ee95, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0x1ee96, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0x1ee97, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1ee98, G_UNICODE_NOT_PRESENT_OFFSET, 14767 },
+ { 0x1ee99, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1ee9a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0x1ee9b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1eea1, G_UNICODE_NOT_PRESENT_OFFSET, 14743 },
+ { 0x1eea2, G_UNICODE_NOT_PRESENT_OFFSET, 14755 },
+ { 0x1eea3, G_UNICODE_NOT_PRESENT_OFFSET, 14764 },
+ { 0x1eea5, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0x1eea6, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0x1eea7, G_UNICODE_NOT_PRESENT_OFFSET, 14758 },
+ { 0x1eea8, G_UNICODE_NOT_PRESENT_OFFSET, 14788 },
+ { 0x1eea9, G_UNICODE_NOT_PRESENT_OFFSET, 14824 },
+ { 0x1eeab, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0x1eeac, G_UNICODE_NOT_PRESENT_OFFSET, 14812 },
+ { 0x1eead, G_UNICODE_NOT_PRESENT_OFFSET, 14815 },
+ { 0x1eeae, G_UNICODE_NOT_PRESENT_OFFSET, 14776 },
+ { 0x1eeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14794 },
+ { 0x1eeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14800 },
+ { 0x1eeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14782 },
+ { 0x1eeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14803 },
+ { 0x1eeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14770 },
+ { 0x1eeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14779 },
+ { 0x1eeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14749 },
+ { 0x1eeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14752 },
+ { 0x1eeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14761 },
+ { 0x1eeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14767 },
+ { 0x1eeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0x1eeba, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0x1eebb, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0x1f100, G_UNICODE_NOT_PRESENT_OFFSET, 15293 },
+ { 0x1f101, G_UNICODE_NOT_PRESENT_OFFSET, 15296 },
+ { 0x1f102, G_UNICODE_NOT_PRESENT_OFFSET, 15299 },
+ { 0x1f103, G_UNICODE_NOT_PRESENT_OFFSET, 15302 },
+ { 0x1f104, G_UNICODE_NOT_PRESENT_OFFSET, 15305 },
+ { 0x1f105, G_UNICODE_NOT_PRESENT_OFFSET, 15308 },
+ { 0x1f106, G_UNICODE_NOT_PRESENT_OFFSET, 15311 },
+ { 0x1f107, G_UNICODE_NOT_PRESENT_OFFSET, 15314 },
+ { 0x1f108, G_UNICODE_NOT_PRESENT_OFFSET, 15317 },
+ { 0x1f109, G_UNICODE_NOT_PRESENT_OFFSET, 15320 },
+ { 0x1f10a, G_UNICODE_NOT_PRESENT_OFFSET, 15323 },
+ { 0x1f110, G_UNICODE_NOT_PRESENT_OFFSET, 15326 },
+ { 0x1f111, G_UNICODE_NOT_PRESENT_OFFSET, 15330 },
+ { 0x1f112, G_UNICODE_NOT_PRESENT_OFFSET, 15334 },
+ { 0x1f113, G_UNICODE_NOT_PRESENT_OFFSET, 15338 },
+ { 0x1f114, G_UNICODE_NOT_PRESENT_OFFSET, 15342 },
+ { 0x1f115, G_UNICODE_NOT_PRESENT_OFFSET, 15346 },
+ { 0x1f116, G_UNICODE_NOT_PRESENT_OFFSET, 15350 },
+ { 0x1f117, G_UNICODE_NOT_PRESENT_OFFSET, 15354 },
+ { 0x1f118, G_UNICODE_NOT_PRESENT_OFFSET, 15358 },
+ { 0x1f119, G_UNICODE_NOT_PRESENT_OFFSET, 15362 },
+ { 0x1f11a, G_UNICODE_NOT_PRESENT_OFFSET, 15366 },
+ { 0x1f11b, G_UNICODE_NOT_PRESENT_OFFSET, 15370 },
+ { 0x1f11c, G_UNICODE_NOT_PRESENT_OFFSET, 15374 },
+ { 0x1f11d, G_UNICODE_NOT_PRESENT_OFFSET, 15378 },
+ { 0x1f11e, G_UNICODE_NOT_PRESENT_OFFSET, 15382 },
+ { 0x1f11f, G_UNICODE_NOT_PRESENT_OFFSET, 15386 },
+ { 0x1f120, G_UNICODE_NOT_PRESENT_OFFSET, 15390 },
+ { 0x1f121, G_UNICODE_NOT_PRESENT_OFFSET, 15394 },
+ { 0x1f122, G_UNICODE_NOT_PRESENT_OFFSET, 15398 },
+ { 0x1f123, G_UNICODE_NOT_PRESENT_OFFSET, 15402 },
+ { 0x1f124, G_UNICODE_NOT_PRESENT_OFFSET, 15406 },
+ { 0x1f125, G_UNICODE_NOT_PRESENT_OFFSET, 15410 },
+ { 0x1f126, G_UNICODE_NOT_PRESENT_OFFSET, 15414 },
+ { 0x1f127, G_UNICODE_NOT_PRESENT_OFFSET, 15418 },
+ { 0x1f128, G_UNICODE_NOT_PRESENT_OFFSET, 15422 },
+ { 0x1f129, G_UNICODE_NOT_PRESENT_OFFSET, 15426 },
+ { 0x1f12a, G_UNICODE_NOT_PRESENT_OFFSET, 15430 },
{ 0x1f12b, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
{ 0x1f12c, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
- { 0x1f12d, G_UNICODE_NOT_PRESENT_OFFSET, 15397 },
- { 0x1f12e, G_UNICODE_NOT_PRESENT_OFFSET, 15400 },
+ { 0x1f12d, G_UNICODE_NOT_PRESENT_OFFSET, 15438 },
+ { 0x1f12e, G_UNICODE_NOT_PRESENT_OFFSET, 15441 },
{ 0x1f130, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
{ 0x1f131, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
{ 0x1f132, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
@@ -7023,612 +7197,614 @@ static const decomposition decomp_table[] =
{ 0x1f147, G_UNICODE_NOT_PRESENT_OFFSET, 5487 },
{ 0x1f148, G_UNICODE_NOT_PRESENT_OFFSET, 6135 },
{ 0x1f149, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
- { 0x1f14a, G_UNICODE_NOT_PRESENT_OFFSET, 15403 },
+ { 0x1f14a, G_UNICODE_NOT_PRESENT_OFFSET, 15444 },
{ 0x1f14b, G_UNICODE_NOT_PRESENT_OFFSET, 10556 },
- { 0x1f14c, G_UNICODE_NOT_PRESENT_OFFSET, 15406 },
- { 0x1f14d, G_UNICODE_NOT_PRESENT_OFFSET, 15409 },
- { 0x1f14e, G_UNICODE_NOT_PRESENT_OFFSET, 15412 },
- { 0x1f14f, G_UNICODE_NOT_PRESENT_OFFSET, 15416 },
- { 0x1f190, G_UNICODE_NOT_PRESENT_OFFSET, 15419 },
- { 0x1f200, G_UNICODE_NOT_PRESENT_OFFSET, 15422 },
- { 0x1f201, G_UNICODE_NOT_PRESENT_OFFSET, 15429 },
+ { 0x1f14c, G_UNICODE_NOT_PRESENT_OFFSET, 15447 },
+ { 0x1f14d, G_UNICODE_NOT_PRESENT_OFFSET, 15450 },
+ { 0x1f14e, G_UNICODE_NOT_PRESENT_OFFSET, 15453 },
+ { 0x1f14f, G_UNICODE_NOT_PRESENT_OFFSET, 15457 },
+ { 0x1f16a, G_UNICODE_NOT_PRESENT_OFFSET, 15460 },
+ { 0x1f16b, G_UNICODE_NOT_PRESENT_OFFSET, 15463 },
+ { 0x1f190, G_UNICODE_NOT_PRESENT_OFFSET, 15466 },
+ { 0x1f200, G_UNICODE_NOT_PRESENT_OFFSET, 15469 },
+ { 0x1f201, G_UNICODE_NOT_PRESENT_OFFSET, 15476 },
{ 0x1f202, G_UNICODE_NOT_PRESENT_OFFSET, 8848 },
{ 0x1f210, G_UNICODE_NOT_PRESENT_OFFSET, 6433 },
- { 0x1f211, G_UNICODE_NOT_PRESENT_OFFSET, 15436 },
- { 0x1f212, G_UNICODE_NOT_PRESENT_OFFSET, 15440 },
+ { 0x1f211, G_UNICODE_NOT_PRESENT_OFFSET, 15483 },
+ { 0x1f212, G_UNICODE_NOT_PRESENT_OFFSET, 15487 },
{ 0x1f213, G_UNICODE_NOT_PRESENT_OFFSET, 7346 },
{ 0x1f214, G_UNICODE_NOT_PRESENT_OFFSET, 6205 },
- { 0x1f215, G_UNICODE_NOT_PRESENT_OFFSET, 15444 },
- { 0x1f216, G_UNICODE_NOT_PRESENT_OFFSET, 15448 },
+ { 0x1f215, G_UNICODE_NOT_PRESENT_OFFSET, 15491 },
+ { 0x1f216, G_UNICODE_NOT_PRESENT_OFFSET, 15495 },
{ 0x1f217, G_UNICODE_NOT_PRESENT_OFFSET, 7887 },
- { 0x1f218, G_UNICODE_NOT_PRESENT_OFFSET, 15452 },
- { 0x1f219, G_UNICODE_NOT_PRESENT_OFFSET, 15456 },
- { 0x1f21a, G_UNICODE_NOT_PRESENT_OFFSET, 15460 },
- { 0x1f21b, G_UNICODE_NOT_PRESENT_OFFSET, 11592 },
- { 0x1f21c, G_UNICODE_NOT_PRESENT_OFFSET, 15464 },
- { 0x1f21d, G_UNICODE_NOT_PRESENT_OFFSET, 15468 },
- { 0x1f21e, G_UNICODE_NOT_PRESENT_OFFSET, 15472 },
- { 0x1f21f, G_UNICODE_NOT_PRESENT_OFFSET, 15476 },
- { 0x1f220, G_UNICODE_NOT_PRESENT_OFFSET, 15480 },
- { 0x1f221, G_UNICODE_NOT_PRESENT_OFFSET, 15484 },
+ { 0x1f218, G_UNICODE_NOT_PRESENT_OFFSET, 15499 },
+ { 0x1f219, G_UNICODE_NOT_PRESENT_OFFSET, 15503 },
+ { 0x1f21a, G_UNICODE_NOT_PRESENT_OFFSET, 15507 },
+ { 0x1f21b, G_UNICODE_NOT_PRESENT_OFFSET, 11598 },
+ { 0x1f21c, G_UNICODE_NOT_PRESENT_OFFSET, 15511 },
+ { 0x1f21d, G_UNICODE_NOT_PRESENT_OFFSET, 15515 },
+ { 0x1f21e, G_UNICODE_NOT_PRESENT_OFFSET, 15519 },
+ { 0x1f21f, G_UNICODE_NOT_PRESENT_OFFSET, 15523 },
+ { 0x1f220, G_UNICODE_NOT_PRESENT_OFFSET, 15527 },
+ { 0x1f221, G_UNICODE_NOT_PRESENT_OFFSET, 15531 },
{ 0x1f222, G_UNICODE_NOT_PRESENT_OFFSET, 6577 },
- { 0x1f223, G_UNICODE_NOT_PRESENT_OFFSET, 15488 },
- { 0x1f224, G_UNICODE_NOT_PRESENT_OFFSET, 15492 },
- { 0x1f225, G_UNICODE_NOT_PRESENT_OFFSET, 15496 },
- { 0x1f226, G_UNICODE_NOT_PRESENT_OFFSET, 15500 },
- { 0x1f227, G_UNICODE_NOT_PRESENT_OFFSET, 15504 },
- { 0x1f228, G_UNICODE_NOT_PRESENT_OFFSET, 15508 },
+ { 0x1f223, G_UNICODE_NOT_PRESENT_OFFSET, 15535 },
+ { 0x1f224, G_UNICODE_NOT_PRESENT_OFFSET, 15539 },
+ { 0x1f225, G_UNICODE_NOT_PRESENT_OFFSET, 15543 },
+ { 0x1f226, G_UNICODE_NOT_PRESENT_OFFSET, 15547 },
+ { 0x1f227, G_UNICODE_NOT_PRESENT_OFFSET, 15551 },
+ { 0x1f228, G_UNICODE_NOT_PRESENT_OFFSET, 15555 },
{ 0x1f229, G_UNICODE_NOT_PRESENT_OFFSET, 6181 },
{ 0x1f22a, G_UNICODE_NOT_PRESENT_OFFSET, 7855 },
- { 0x1f22b, G_UNICODE_NOT_PRESENT_OFFSET, 15512 },
+ { 0x1f22b, G_UNICODE_NOT_PRESENT_OFFSET, 15559 },
{ 0x1f22c, G_UNICODE_NOT_PRESENT_OFFSET, 8646 },
{ 0x1f22d, G_UNICODE_NOT_PRESENT_OFFSET, 7867 },
{ 0x1f22e, G_UNICODE_NOT_PRESENT_OFFSET, 8650 },
- { 0x1f22f, G_UNICODE_NOT_PRESENT_OFFSET, 15516 },
+ { 0x1f22f, G_UNICODE_NOT_PRESENT_OFFSET, 15563 },
{ 0x1f230, G_UNICODE_NOT_PRESENT_OFFSET, 6801 },
- { 0x1f231, G_UNICODE_NOT_PRESENT_OFFSET, 15520 },
- { 0x1f232, G_UNICODE_NOT_PRESENT_OFFSET, 15524 },
- { 0x1f233, G_UNICODE_NOT_PRESENT_OFFSET, 15528 },
- { 0x1f234, G_UNICODE_NOT_PRESENT_OFFSET, 15532 },
- { 0x1f235, G_UNICODE_NOT_PRESENT_OFFSET, 15536 },
+ { 0x1f231, G_UNICODE_NOT_PRESENT_OFFSET, 15567 },
+ { 0x1f232, G_UNICODE_NOT_PRESENT_OFFSET, 15571 },
+ { 0x1f233, G_UNICODE_NOT_PRESENT_OFFSET, 15575 },
+ { 0x1f234, G_UNICODE_NOT_PRESENT_OFFSET, 15579 },
+ { 0x1f235, G_UNICODE_NOT_PRESENT_OFFSET, 15583 },
{ 0x1f236, G_UNICODE_NOT_PRESENT_OFFSET, 8578 },
{ 0x1f237, G_UNICODE_NOT_PRESENT_OFFSET, 6473 },
- { 0x1f238, G_UNICODE_NOT_PRESENT_OFFSET, 15540 },
- { 0x1f239, G_UNICODE_NOT_PRESENT_OFFSET, 15544 },
- { 0x1f23a, G_UNICODE_NOT_PRESENT_OFFSET, 15548 },
- { 0x1f240, G_UNICODE_NOT_PRESENT_OFFSET, 15552 },
- { 0x1f241, G_UNICODE_NOT_PRESENT_OFFSET, 15562 },
- { 0x1f242, G_UNICODE_NOT_PRESENT_OFFSET, 15572 },
- { 0x1f243, G_UNICODE_NOT_PRESENT_OFFSET, 15582 },
- { 0x1f244, G_UNICODE_NOT_PRESENT_OFFSET, 15592 },
- { 0x1f245, G_UNICODE_NOT_PRESENT_OFFSET, 15602 },
- { 0x1f246, G_UNICODE_NOT_PRESENT_OFFSET, 15612 },
- { 0x1f247, G_UNICODE_NOT_PRESENT_OFFSET, 15622 },
- { 0x1f248, G_UNICODE_NOT_PRESENT_OFFSET, 15632 },
- { 0x1f250, G_UNICODE_NOT_PRESENT_OFFSET, 15642 },
- { 0x1f251, G_UNICODE_NOT_PRESENT_OFFSET, 15646 },
- { 0x2f800, 15650, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f801, 15654, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f802, 15658, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f803, 15662, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f804, 15667, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f805, 11956, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f806, 15671, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f807, 15675, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f808, 15679, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f809, 15683, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80a, 11960, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80b, 15687, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80c, 15691, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80d, 15695, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80e, 11964, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f80f, 15700, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f810, 15704, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f811, 15708, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f812, 15712, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f813, 15717, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f814, 15721, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f815, 15472, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f816, 15725, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f817, 15730, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f818, 15734, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f819, 15738, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f81a, 15742, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f81b, 12185, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f81c, 15746, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f238, G_UNICODE_NOT_PRESENT_OFFSET, 15587 },
+ { 0x1f239, G_UNICODE_NOT_PRESENT_OFFSET, 15591 },
+ { 0x1f23a, G_UNICODE_NOT_PRESENT_OFFSET, 15595 },
+ { 0x1f240, G_UNICODE_NOT_PRESENT_OFFSET, 15599 },
+ { 0x1f241, G_UNICODE_NOT_PRESENT_OFFSET, 15609 },
+ { 0x1f242, G_UNICODE_NOT_PRESENT_OFFSET, 15619 },
+ { 0x1f243, G_UNICODE_NOT_PRESENT_OFFSET, 15629 },
+ { 0x1f244, G_UNICODE_NOT_PRESENT_OFFSET, 15639 },
+ { 0x1f245, G_UNICODE_NOT_PRESENT_OFFSET, 15649 },
+ { 0x1f246, G_UNICODE_NOT_PRESENT_OFFSET, 15659 },
+ { 0x1f247, G_UNICODE_NOT_PRESENT_OFFSET, 15669 },
+ { 0x1f248, G_UNICODE_NOT_PRESENT_OFFSET, 15679 },
+ { 0x1f250, G_UNICODE_NOT_PRESENT_OFFSET, 15689 },
+ { 0x1f251, G_UNICODE_NOT_PRESENT_OFFSET, 15693 },
+ { 0x2f800, 15697, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f801, 15701, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f802, 15705, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f803, 15709, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f804, 15714, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f805, 11970, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f806, 15718, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f807, 15722, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f808, 15726, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f809, 15730, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80a, 11974, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80b, 15734, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80c, 15738, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80d, 15742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80e, 11978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80f, 15747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f810, 15751, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f811, 15755, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f812, 15759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f813, 15764, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f814, 15768, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f815, 15519, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f816, 15772, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f817, 15777, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f818, 15781, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f819, 15785, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81a, 15789, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81b, 12199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81c, 15793, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f81d, 6245, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f81e, 15751, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f81f, 15755, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f820, 15759, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f821, 15763, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f822, 15544, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f823, 15767, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f824, 15771, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f825, 12205, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f826, 11968, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f827, 11972, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f828, 12209, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f829, 15775, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82a, 15779, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82b, 11248, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82c, 15783, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82d, 11976, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82e, 15787, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f82f, 15791, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f830, 15795, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f831, 15799, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f832, 15799, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f833, 15799, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f834, 15803, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f835, 15808, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f836, 15812, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f837, 15816, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f838, 15820, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f839, 15825, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83a, 15829, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83b, 15833, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83c, 15837, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83d, 15841, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83e, 15845, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f83f, 15849, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f840, 15853, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f841, 15857, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f842, 15861, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f843, 15865, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f844, 15869, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f845, 15873, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f846, 15873, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f847, 12217, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f848, 15877, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f849, 15881, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84a, 15885, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84b, 15889, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84c, 11984, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84d, 15893, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84e, 15897, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f84f, 15901, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f850, 11832, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f851, 15905, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f852, 15909, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f853, 15913, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f854, 15917, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f855, 15921, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f856, 15925, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f857, 15929, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f858, 15933, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f859, 15937, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85a, 15942, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85b, 15946, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85c, 15950, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85d, 15444, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85e, 15954, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f85f, 15958, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f860, 15962, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f861, 15967, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f862, 15972, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f863, 15976, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f864, 15980, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f865, 15984, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f866, 15988, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f867, 15992, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f868, 15996, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f869, 16000, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86a, 16004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86b, 16004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86c, 16008, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86d, 16013, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86e, 16017, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f86f, 11232, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f870, 16021, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f871, 16025, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f872, 16030, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f873, 16034, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f874, 16038, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81e, 15798, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81f, 15802, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f820, 15806, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f821, 15810, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f822, 15591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f823, 15814, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f824, 15818, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f825, 12219, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f826, 11982, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f827, 11986, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f828, 12223, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f829, 15822, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82a, 15826, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82b, 11254, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82c, 15830, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82d, 11990, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82e, 15834, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82f, 15838, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f830, 15842, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f831, 15846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f832, 15846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f833, 15846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f834, 15850, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f835, 15855, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f836, 15859, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f837, 15863, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f838, 15867, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f839, 15872, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83a, 15876, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83b, 15880, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83c, 15884, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83d, 15888, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83e, 15892, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83f, 15896, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f840, 15900, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f841, 15904, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f842, 15908, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f843, 15912, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f844, 15916, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f845, 15920, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f846, 15920, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f847, 12231, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f848, 15924, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f849, 15928, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84a, 15932, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84b, 15936, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84c, 11998, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84d, 15940, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84e, 15944, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84f, 15948, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f850, 11838, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f851, 15952, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f852, 15956, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f853, 15960, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f854, 15964, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f855, 15968, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f856, 15972, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f857, 15976, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f858, 15980, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f859, 15984, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85a, 15989, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85b, 15993, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85c, 15997, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85d, 15491, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85e, 16001, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85f, 16005, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f860, 16009, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f861, 16014, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f862, 16019, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f863, 16023, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f864, 16027, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f865, 16031, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f866, 16035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f867, 16039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f868, 16043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f869, 16047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86a, 16051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86b, 16051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86c, 16055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86d, 16060, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86e, 16064, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86f, 11238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f870, 16068, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f871, 16072, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f872, 16077, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f873, 16081, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f874, 16085, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f875, 6349, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f876, 16042, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f877, 16046, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f876, 16089, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f877, 16093, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f878, 6357, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f879, 16050, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87a, 16054, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87b, 16058, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87c, 16063, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87d, 16067, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87e, 16072, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f87f, 16076, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f880, 16080, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f881, 16084, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f882, 16088, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f883, 16092, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f884, 16096, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f885, 16100, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f886, 16104, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f887, 16108, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f888, 16112, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f889, 16116, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88a, 16121, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88b, 16125, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88c, 16129, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88d, 16133, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88e, 11024, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f88f, 16137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f879, 16097, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87a, 16101, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87b, 16105, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87c, 16110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87d, 16114, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87e, 16119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87f, 16123, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f880, 16127, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f881, 16131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f882, 16135, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f883, 16139, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f884, 16143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f885, 16147, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f886, 16151, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f887, 16155, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f888, 16159, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f889, 16163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88a, 16168, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88b, 16172, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88c, 16176, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88d, 16180, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88e, 11030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88f, 16184, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f890, 6397, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f891, 16142, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f892, 16142, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f893, 16147, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f894, 16151, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f895, 16151, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f896, 16155, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f897, 16159, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f898, 16164, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f899, 16169, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89a, 16173, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89b, 16177, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89c, 16181, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89d, 16185, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89e, 16189, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f89f, 16193, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a0, 16197, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a1, 16201, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a2, 16205, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a3, 12004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a4, 16209, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a5, 16214, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a6, 16218, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a7, 16222, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a8, 12265, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8a9, 16222, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8aa, 16226, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ab, 12012, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ac, 16230, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ad, 16234, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ae, 16238, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8af, 16242, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b0, 12016, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b1, 10916, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b2, 16246, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b3, 16250, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b4, 16254, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b5, 16258, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b6, 16262, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b7, 16266, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b8, 16270, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8b9, 16275, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ba, 16279, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8bb, 16283, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8bc, 16287, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8bd, 16291, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8be, 16295, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8bf, 16300, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c0, 16304, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c1, 16308, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c2, 16312, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c3, 16316, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c4, 16320, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c5, 16324, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c6, 16328, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c7, 16332, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c8, 12020, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8c9, 16336, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ca, 16340, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8cb, 16345, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8cc, 16349, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8cd, 16353, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ce, 16357, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8cf, 12028, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d0, 16361, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d1, 16365, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d2, 16369, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d3, 16373, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d4, 16377, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d5, 16381, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d6, 16385, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d7, 16389, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d8, 11028, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8d9, 12297, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8da, 16393, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8db, 16397, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8dc, 16401, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8dd, 16405, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8de, 16410, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8df, 16414, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e0, 16418, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e1, 16422, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e2, 12032, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e3, 16426, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e4, 16431, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e5, 16435, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e6, 16439, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e7, 12468, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e8, 16443, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8e9, 16447, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ea, 16451, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8eb, 16455, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ec, 16459, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ed, 16464, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ee, 16468, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ef, 16472, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f0, 16476, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f1, 16481, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f2, 16485, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f3, 16489, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f4, 16493, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f5, 11300, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f6, 16497, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f7, 16501, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f8, 16506, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8f9, 16511, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8fa, 16516, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8fb, 16520, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8fc, 16525, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8fd, 16529, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8fe, 16533, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f8ff, 16537, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f900, 16541, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f901, 12036, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f902, 11632, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f903, 16545, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f904, 16549, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f905, 16553, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f906, 16557, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f907, 16562, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f908, 16566, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f909, 16570, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90a, 16574, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90b, 12309, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90c, 16578, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90d, 16582, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90e, 16587, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f90f, 16591, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f910, 16595, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f911, 16600, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f912, 16605, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f913, 16609, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f914, 12313, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f915, 16613, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f916, 16617, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f917, 16621, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f918, 16625, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f919, 16629, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91a, 16633, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91b, 16637, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91c, 16642, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91d, 16646, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91e, 16651, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f91f, 16655, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f920, 16660, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f921, 12321, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f922, 16664, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f923, 16668, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f924, 16673, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f925, 16677, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f926, 16681, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f927, 16686, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f928, 16691, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f929, 16695, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92a, 16699, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92b, 16703, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92c, 16707, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92d, 16707, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92e, 16711, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f92f, 16715, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f930, 12329, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f931, 16719, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f932, 16723, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f933, 16727, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f934, 16731, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f935, 16735, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f936, 16740, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f937, 16744, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f938, 11244, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f939, 16749, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93a, 16754, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93b, 16758, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93c, 16763, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93d, 16768, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93e, 16773, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f93f, 16777, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f940, 12353, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f941, 16781, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f942, 16786, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f943, 16791, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f944, 16796, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f945, 16801, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f946, 16805, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f947, 16805, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f948, 12357, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f949, 12476, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94a, 16809, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94b, 16813, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94c, 16817, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94d, 16821, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94e, 16826, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f94f, 11096, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f950, 12365, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f951, 16830, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f952, 16834, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f953, 12076, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f954, 16839, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f955, 16844, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f956, 11912, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f957, 16849, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f958, 16853, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f959, 12088, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95a, 16857, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95b, 16861, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95c, 16865, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95d, 16870, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95e, 16870, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f95f, 16875, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f960, 16879, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f961, 16883, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f962, 16888, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f963, 16892, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f964, 16896, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f965, 16900, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f966, 16905, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f967, 16909, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f968, 16913, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f969, 16917, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96a, 16921, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96b, 16925, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96c, 16930, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96d, 16934, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96e, 16938, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f96f, 16942, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f970, 16946, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f971, 16950, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f972, 16954, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f973, 16959, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f974, 16964, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f975, 16968, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f976, 16973, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f977, 16977, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f978, 16982, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f979, 16986, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97a, 12112, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97b, 16990, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97c, 16995, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97d, 17000, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97e, 17004, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f97f, 17009, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f980, 17013, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f981, 17018, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f982, 17022, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f983, 17026, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f984, 17030, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f985, 17034, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f986, 17038, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f987, 17042, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f988, 17047, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f989, 17052, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98a, 17057, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98b, 16147, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98c, 17062, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98d, 17066, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98e, 17070, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f98f, 17074, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f990, 17078, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f991, 17082, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f992, 17086, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f993, 17090, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f994, 17094, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f995, 17098, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f996, 17102, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f997, 17106, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f998, 11312, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f999, 17111, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99a, 17115, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99b, 17119, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99c, 17123, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99d, 17127, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99e, 17131, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f99f, 12124, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a0, 17135, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a1, 17139, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a2, 17143, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a3, 17147, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a4, 17151, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a5, 17156, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a6, 17161, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a7, 17166, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a8, 17170, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9a9, 17174, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9aa, 17178, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ab, 17182, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ac, 17187, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ad, 17191, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ae, 17196, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9af, 17200, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b0, 17204, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b1, 17209, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b2, 17214, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b3, 17218, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b4, 11076, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b5, 17222, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b6, 17226, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b7, 17230, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b8, 17234, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9b9, 17238, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ba, 17242, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9bb, 12393, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9bc, 17246, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9bd, 17250, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9be, 17254, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9bf, 17258, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c0, 17262, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c1, 17266, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c2, 17270, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c3, 17274, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f891, 16189, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f892, 16189, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f893, 16194, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f894, 16198, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f895, 16198, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f896, 16202, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f897, 16206, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f898, 16211, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f899, 16216, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89a, 16220, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89b, 16224, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89c, 16228, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89d, 16232, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89e, 16236, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89f, 16240, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a0, 16244, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a1, 16248, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a2, 16252, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a3, 12018, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a4, 16256, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a5, 16261, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a6, 16265, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a7, 16269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a8, 12279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a9, 16269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8aa, 16273, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ab, 12026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ac, 16277, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ad, 16281, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ae, 16285, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8af, 16289, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b0, 12030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b1, 10922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b2, 16293, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b3, 16297, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b4, 16301, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b5, 16305, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b6, 16309, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b7, 16313, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b8, 16317, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b9, 16322, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ba, 16326, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bb, 16330, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bc, 16334, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bd, 16338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8be, 16342, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bf, 16347, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c0, 16351, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c1, 16355, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c2, 16359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c3, 16363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c4, 16367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c5, 16371, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c6, 16375, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c7, 16379, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c8, 12034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c9, 16383, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ca, 16387, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cb, 16392, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cc, 16396, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cd, 16400, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ce, 16404, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cf, 12042, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d0, 16408, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d1, 16412, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d2, 16416, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d3, 16420, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d4, 16424, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d5, 16428, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d6, 16432, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d7, 16436, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d8, 11034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d9, 12311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8da, 16440, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8db, 16444, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8dc, 16448, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8dd, 16452, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8de, 16457, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8df, 16461, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e0, 16465, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e1, 16469, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e2, 12046, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e3, 16473, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e4, 16478, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e5, 16482, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e6, 16486, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e7, 12482, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e8, 16490, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e9, 16494, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ea, 16498, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8eb, 16502, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ec, 16506, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ed, 16511, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ee, 16515, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ef, 16519, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f0, 16523, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f1, 16528, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f2, 16532, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f3, 16536, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f4, 16540, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f5, 11306, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f6, 16544, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f7, 16548, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f8, 16553, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f9, 16558, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fa, 16563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fb, 16567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fc, 16572, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fd, 16576, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fe, 16580, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ff, 16584, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f900, 16588, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f901, 12050, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f902, 11638, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f903, 16592, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f904, 16596, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f905, 16600, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f906, 16604, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f907, 16609, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f908, 16613, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f909, 16617, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90a, 16621, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90b, 12323, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90c, 16625, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90d, 16629, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90e, 16634, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90f, 16638, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f910, 16642, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f911, 16647, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f912, 16652, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f913, 16656, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f914, 12327, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f915, 16660, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f916, 16664, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f917, 16668, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f918, 16672, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f919, 16676, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91a, 16680, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91b, 16684, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91c, 16689, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91d, 16693, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91e, 16698, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91f, 16702, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f920, 16707, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f921, 12335, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f922, 16711, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f923, 16715, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f924, 16720, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f925, 16724, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f926, 16728, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f927, 16733, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f928, 16738, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f929, 16742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92a, 16746, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92b, 16750, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92c, 16754, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92d, 16754, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92e, 16758, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92f, 16762, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f930, 12343, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f931, 16766, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f932, 16770, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f933, 16774, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f934, 16778, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f935, 16782, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f936, 16787, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f937, 16791, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f938, 11250, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f939, 16796, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93a, 16801, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93b, 16805, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93c, 16810, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93d, 16815, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93e, 16820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93f, 16824, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f940, 12367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f941, 16828, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f942, 16833, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f943, 16838, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f944, 16843, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f945, 16848, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f946, 16852, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f947, 16852, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f948, 12371, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f949, 12490, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94a, 16856, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94b, 16860, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94c, 16864, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94d, 16868, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94e, 16873, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94f, 11102, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f950, 12379, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f951, 16877, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f952, 16881, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f953, 12090, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f954, 16886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f955, 16891, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f956, 11918, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f957, 16896, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f958, 16900, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f959, 12102, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95a, 16904, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95b, 16908, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95c, 16912, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95d, 16917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95e, 16917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95f, 16922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f960, 16926, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f961, 16930, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f962, 16935, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f963, 16939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f964, 16943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f965, 16947, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f966, 16952, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f967, 16956, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f968, 16960, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f969, 16964, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96a, 16968, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96b, 16972, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96c, 16977, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96d, 16981, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96e, 16985, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96f, 16989, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f970, 16993, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f971, 16997, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f972, 17001, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f973, 17006, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f974, 17011, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f975, 17015, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f976, 17020, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f977, 17024, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f978, 17029, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f979, 17033, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97a, 12126, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97b, 17037, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97c, 17042, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97d, 17047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97e, 17051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97f, 17056, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f980, 17060, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f981, 17065, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f982, 17069, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f983, 17073, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f984, 17077, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f985, 17081, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f986, 17085, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f987, 17089, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f988, 17094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f989, 17099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98a, 17104, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98b, 16194, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98c, 17109, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98d, 17113, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98e, 17117, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98f, 17121, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f990, 17125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f991, 17129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f992, 17133, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f993, 17137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f994, 17141, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f995, 17145, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f996, 17149, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f997, 17153, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f998, 11318, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f999, 17158, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99a, 17162, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99b, 17166, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99c, 17170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99d, 17174, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99e, 17178, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99f, 12138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a0, 17182, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a1, 17186, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a2, 17190, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a3, 17194, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a4, 17198, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a5, 17203, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a6, 17208, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a7, 17213, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a8, 17217, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a9, 17221, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9aa, 17225, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ab, 17229, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ac, 17234, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ad, 17238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ae, 17243, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9af, 17247, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b0, 17251, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b1, 17256, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b2, 17261, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b3, 17265, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b4, 11082, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b5, 17269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b6, 17273, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b7, 17277, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b8, 17281, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b9, 17285, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ba, 17289, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bb, 12407, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bc, 17293, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bd, 17297, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9be, 17301, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bf, 17305, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c0, 17309, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c1, 17313, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c2, 17317, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c3, 17321, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f9c4, 6757, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c5, 17278, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c6, 17283, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c7, 17287, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c8, 17291, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9c9, 17295, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ca, 17299, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9cb, 17303, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9cc, 17308, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9cd, 17313, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ce, 17317, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9cf, 17321, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d0, 12413, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d1, 12417, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c5, 17325, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c6, 17330, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c7, 17334, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c8, 17338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c9, 17342, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ca, 17346, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cb, 17350, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cc, 17355, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cd, 17360, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ce, 17364, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cf, 17368, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d0, 12427, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d1, 12431, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2f9d2, 6785, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d3, 17325, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d4, 17330, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d5, 17334, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d6, 17338, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d7, 17342, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d8, 17346, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9d9, 17351, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9da, 17356, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9db, 17360, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9dc, 17364, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9dd, 17368, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9de, 17373, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9df, 12421, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e0, 17377, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e1, 17382, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e2, 17387, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e3, 17391, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e4, 17395, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e5, 17399, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e6, 17404, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e7, 17408, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e8, 17412, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9e9, 17416, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ea, 17420, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9eb, 17424, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ec, 17428, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ed, 17432, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ee, 17437, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ef, 17441, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f0, 17445, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f1, 17449, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f2, 17454, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f3, 17458, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f4, 17462, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f5, 17466, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f6, 17470, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f7, 17475, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f8, 17480, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9f9, 17484, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9fa, 17488, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9fb, 17492, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9fc, 17497, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9fd, 17501, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9fe, 12445, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2f9ff, 12445, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa00, 17506, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa01, 17510, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa02, 17515, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa03, 17519, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa04, 17523, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa05, 17527, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa06, 17531, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa07, 17535, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa08, 17539, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa09, 17543, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0a, 12449, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0b, 17548, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0c, 17552, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0d, 17556, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0e, 17560, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa0f, 17564, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa10, 17568, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa11, 17573, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa12, 17577, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa13, 17582, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa14, 17587, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d3, 17372, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d4, 17377, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d5, 17381, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d6, 17385, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d7, 17389, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d8, 17393, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d9, 17398, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9da, 17403, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9db, 17407, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9dc, 17411, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9dd, 17415, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9de, 17420, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9df, 12435, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e0, 17424, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e1, 17429, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e2, 17434, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e3, 17438, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e4, 17442, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e5, 17446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e6, 17451, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e7, 17455, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e8, 17459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e9, 17463, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ea, 17467, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9eb, 17471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ec, 17475, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ed, 17479, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ee, 17484, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ef, 17488, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f0, 17492, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f1, 17496, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f2, 17501, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f3, 17505, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f4, 17509, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f5, 17513, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f6, 17517, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f7, 17522, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f8, 17527, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f9, 17531, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fa, 17535, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fb, 17539, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fc, 17544, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fd, 17548, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fe, 12459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ff, 12459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa00, 17553, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa01, 17557, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa02, 17562, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa03, 17566, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa04, 17570, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa05, 17574, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa06, 17578, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa07, 17582, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa08, 17586, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa09, 17590, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0a, 12463, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0b, 17595, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0c, 17599, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0d, 17603, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0e, 17607, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0f, 17611, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa10, 17615, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa11, 17620, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa12, 17624, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa13, 17629, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa14, 17634, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2fa15, 6977, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa16, 17592, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa16, 17639, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2fa17, 6993, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa18, 17596, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa19, 17600, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa1a, 17604, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa1b, 17608, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa18, 17643, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa19, 17647, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1a, 17651, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1b, 17655, G_UNICODE_NOT_PRESENT_OFFSET },
{ 0x2fa1c, 7013, G_UNICODE_NOT_PRESENT_OFFSET },
- { 0x2fa1d, 17612, G_UNICODE_NOT_PRESENT_OFFSET }
+ { 0x2fa1d, 17659, G_UNICODE_NOT_PRESENT_OFFSET }
};
static const gchar decomp_expansion_string[] =
@@ -9761,1502 +9937,1513 @@ static const gchar decomp_expansion_string[] =
"\x33\x31\xe6\x97\xa5\0" /* offset 10866 */
"\x67\x61\x6c\0" /* offset 10872 */
"\xea\x9d\xaf\0" /* offset 10876 */
- "\xe8\xb1\x88\0" /* offset 10880 */
- "\xe6\x9b\xb4\0" /* offset 10884 */
- "\xe8\xb3\x88\0" /* offset 10888 */
- "\xe6\xbb\x91\0" /* offset 10892 */
- "\xe4\xb8\xb2\0" /* offset 10896 */
- "\xe5\x8f\xa5\0" /* offset 10900 */
- "\xe5\xa5\x91\0" /* offset 10904 */
- "\xe5\x96\x87\0" /* offset 10908 */
- "\xe5\xa5\x88\0" /* offset 10912 */
- "\xe6\x87\xb6\0" /* offset 10916 */
- "\xe7\x99\xa9\0" /* offset 10920 */
- "\xe7\xbe\x85\0" /* offset 10924 */
- "\xe8\x98\xbf\0" /* offset 10928 */
- "\xe8\x9e\xba\0" /* offset 10932 */
- "\xe8\xa3\xb8\0" /* offset 10936 */
- "\xe9\x82\x8f\0" /* offset 10940 */
- "\xe6\xa8\x82\0" /* offset 10944 */
- "\xe6\xb4\x9b\0" /* offset 10948 */
- "\xe7\x83\x99\0" /* offset 10952 */
- "\xe7\x8f\x9e\0" /* offset 10956 */
- "\xe8\x90\xbd\0" /* offset 10960 */
- "\xe9\x85\xaa\0" /* offset 10964 */
- "\xe9\xa7\xb1\0" /* offset 10968 */
- "\xe4\xba\x82\0" /* offset 10972 */
- "\xe5\x8d\xb5\0" /* offset 10976 */
- "\xe6\xac\x84\0" /* offset 10980 */
- "\xe7\x88\x9b\0" /* offset 10984 */
- "\xe8\x98\xad\0" /* offset 10988 */
- "\xe9\xb8\x9e\0" /* offset 10992 */
- "\xe5\xb5\x90\0" /* offset 10996 */
- "\xe6\xbf\xab\0" /* offset 11000 */
- "\xe8\x97\x8d\0" /* offset 11004 */
- "\xe8\xa5\xa4\0" /* offset 11008 */
- "\xe6\x8b\x89\0" /* offset 11012 */
- "\xe8\x87\x98\0" /* offset 11016 */
- "\xe8\xa0\x9f\0" /* offset 11020 */
- "\xe5\xbb\x8a\0" /* offset 11024 */
- "\xe6\x9c\x97\0" /* offset 11028 */
- "\xe6\xb5\xaa\0" /* offset 11032 */
- "\xe7\x8b\xbc\0" /* offset 11036 */
- "\xe9\x83\x8e\0" /* offset 11040 */
- "\xe4\xbe\x86\0" /* offset 11044 */
- "\xe5\x86\xb7\0" /* offset 11048 */
- "\xe5\x8b\x9e\0" /* offset 11052 */
- "\xe6\x93\x84\0" /* offset 11056 */
- "\xe6\xab\x93\0" /* offset 11060 */
- "\xe7\x88\x90\0" /* offset 11064 */
- "\xe7\x9b\xa7\0" /* offset 11068 */
- "\xe8\x98\x86\0" /* offset 11072 */
- "\xe8\x99\x9c\0" /* offset 11076 */
- "\xe8\xb7\xaf\0" /* offset 11080 */
- "\xe9\x9c\xb2\0" /* offset 11084 */
- "\xe9\xad\xaf\0" /* offset 11088 */
- "\xe9\xb7\xba\0" /* offset 11092 */
- "\xe7\xa2\x8c\0" /* offset 11096 */
- "\xe7\xa5\xbf\0" /* offset 11100 */
- "\xe7\xb6\xa0\0" /* offset 11104 */
- "\xe8\x8f\x89\0" /* offset 11108 */
- "\xe9\x8c\x84\0" /* offset 11112 */
- "\xe8\xab\x96\0" /* offset 11116 */
- "\xe5\xa3\x9f\0" /* offset 11120 */
- "\xe5\xbc\x84\0" /* offset 11124 */
- "\xe7\xb1\xa0\0" /* offset 11128 */
- "\xe8\x81\xbe\0" /* offset 11132 */
- "\xe7\x89\xa2\0" /* offset 11136 */
- "\xe7\xa3\x8a\0" /* offset 11140 */
- "\xe8\xb3\x82\0" /* offset 11144 */
- "\xe9\x9b\xb7\0" /* offset 11148 */
- "\xe5\xa3\x98\0" /* offset 11152 */
- "\xe5\xb1\xa2\0" /* offset 11156 */
- "\xe6\xa8\x93\0" /* offset 11160 */
- "\xe6\xb7\x9a\0" /* offset 11164 */
- "\xe6\xbc\x8f\0" /* offset 11168 */
- "\xe7\xb4\xaf\0" /* offset 11172 */
- "\xe7\xb8\xb7\0" /* offset 11176 */
- "\xe9\x99\x8b\0" /* offset 11180 */
- "\xe5\x8b\x92\0" /* offset 11184 */
- "\xe8\x82\x8b\0" /* offset 11188 */
- "\xe5\x87\x9c\0" /* offset 11192 */
- "\xe5\x87\x8c\0" /* offset 11196 */
- "\xe7\xa8\x9c\0" /* offset 11200 */
- "\xe7\xb6\xbe\0" /* offset 11204 */
- "\xe8\x8f\xb1\0" /* offset 11208 */
- "\xe9\x99\xb5\0" /* offset 11212 */
- "\xe8\xae\x80\0" /* offset 11216 */
- "\xe6\x8b\x8f\0" /* offset 11220 */
- "\xe8\xab\xbe\0" /* offset 11224 */
- "\xe4\xb8\xb9\0" /* offset 11228 */
- "\xe5\xaf\xa7\0" /* offset 11232 */
- "\xe6\x80\x92\0" /* offset 11236 */
- "\xe7\x8e\x87\0" /* offset 11240 */
- "\xe7\x95\xb0\0" /* offset 11244 */
- "\xe5\x8c\x97\0" /* offset 11248 */
- "\xe7\xa3\xbb\0" /* offset 11252 */
- "\xe4\xbe\xbf\0" /* offset 11256 */
- "\xe5\xbe\xa9\0" /* offset 11260 */
- "\xe4\xb8\x8d\0" /* offset 11264 */
- "\xe6\xb3\x8c\0" /* offset 11268 */
- "\xe6\x95\xb8\0" /* offset 11272 */
- "\xe7\xb4\xa2\0" /* offset 11276 */
- "\xe5\x8f\x83\0" /* offset 11280 */
- "\xe5\xa1\x9e\0" /* offset 11284 */
- "\xe7\x9c\x81\0" /* offset 11288 */
- "\xe8\x91\x89\0" /* offset 11292 */
- "\xe8\xaa\xaa\0" /* offset 11296 */
- "\xe6\xae\xba\0" /* offset 11300 */
- "\xe6\xb2\x88\0" /* offset 11304 */
- "\xe6\x8b\xbe\0" /* offset 11308 */
- "\xe8\x8b\xa5\0" /* offset 11312 */
- "\xe6\x8e\xa0\0" /* offset 11316 */
- "\xe7\x95\xa5\0" /* offset 11320 */
- "\xe4\xba\xae\0" /* offset 11324 */
- "\xe5\x85\xa9\0" /* offset 11328 */
- "\xe5\x87\x89\0" /* offset 11332 */
- "\xe6\xa2\x81\0" /* offset 11336 */
- "\xe7\xb3\xa7\0" /* offset 11340 */
- "\xe8\x89\xaf\0" /* offset 11344 */
- "\xe8\xab\x92\0" /* offset 11348 */
- "\xe9\x87\x8f\0" /* offset 11352 */
- "\xe5\x8b\xb5\0" /* offset 11356 */
- "\xe5\x91\x82\0" /* offset 11360 */
- "\xe5\xbb\xac\0" /* offset 11364 */
- "\xe6\x97\x85\0" /* offset 11368 */
- "\xe6\xbf\xbe\0" /* offset 11372 */
- "\xe7\xa4\xaa\0" /* offset 11376 */
- "\xe9\x96\xad\0" /* offset 11380 */
- "\xe9\xa9\xaa\0" /* offset 11384 */
- "\xe9\xba\x97\0" /* offset 11388 */
- "\xe9\xbb\x8e\0" /* offset 11392 */
- "\xe6\x9b\x86\0" /* offset 11396 */
- "\xe6\xad\xb7\0" /* offset 11400 */
- "\xe8\xbd\xa2\0" /* offset 11404 */
- "\xe5\xb9\xb4\0" /* offset 11408 */
- "\xe6\x86\x90\0" /* offset 11412 */
- "\xe6\x88\x80\0" /* offset 11416 */
- "\xe6\x92\x9a\0" /* offset 11420 */
- "\xe6\xbc\xa3\0" /* offset 11424 */
- "\xe7\x85\x89\0" /* offset 11428 */
- "\xe7\x92\x89\0" /* offset 11432 */
- "\xe7\xa7\x8a\0" /* offset 11436 */
- "\xe7\xb7\xb4\0" /* offset 11440 */
- "\xe8\x81\xaf\0" /* offset 11444 */
- "\xe8\xbc\xa6\0" /* offset 11448 */
- "\xe8\x93\xae\0" /* offset 11452 */
- "\xe9\x80\xa3\0" /* offset 11456 */
- "\xe9\x8d\x8a\0" /* offset 11460 */
- "\xe5\x88\x97\0" /* offset 11464 */
- "\xe5\x8a\xa3\0" /* offset 11468 */
- "\xe5\x92\xbd\0" /* offset 11472 */
- "\xe7\x83\x88\0" /* offset 11476 */
- "\xe8\xa3\x82\0" /* offset 11480 */
- "\xe5\xbb\x89\0" /* offset 11484 */
- "\xe5\xbf\xb5\0" /* offset 11488 */
- "\xe6\x8d\xbb\0" /* offset 11492 */
- "\xe6\xae\xae\0" /* offset 11496 */
- "\xe7\xb0\xbe\0" /* offset 11500 */
- "\xe7\x8d\xb5\0" /* offset 11504 */
- "\xe4\xbb\xa4\0" /* offset 11508 */
- "\xe5\x9b\xb9\0" /* offset 11512 */
- "\xe5\xb6\xba\0" /* offset 11516 */
- "\xe6\x80\x9c\0" /* offset 11520 */
- "\xe7\x8e\xb2\0" /* offset 11524 */
- "\xe7\x91\xa9\0" /* offset 11528 */
- "\xe7\xbe\x9a\0" /* offset 11532 */
- "\xe8\x81\x86\0" /* offset 11536 */
- "\xe9\x88\xb4\0" /* offset 11540 */
- "\xe9\x9b\xb6\0" /* offset 11544 */
- "\xe9\x9d\x88\0" /* offset 11548 */
- "\xe9\xa0\x98\0" /* offset 11552 */
- "\xe4\xbe\x8b\0" /* offset 11556 */
- "\xe7\xa6\xae\0" /* offset 11560 */
- "\xe9\x86\xb4\0" /* offset 11564 */
- "\xe9\x9a\xb8\0" /* offset 11568 */
- "\xe6\x83\xa1\0" /* offset 11572 */
- "\xe4\xba\x86\0" /* offset 11576 */
- "\xe5\x83\x9a\0" /* offset 11580 */
- "\xe5\xaf\xae\0" /* offset 11584 */
- "\xe5\xb0\xbf\0" /* offset 11588 */
- "\xe6\x96\x99\0" /* offset 11592 */
- "\xe7\x87\x8e\0" /* offset 11596 */
- "\xe7\x99\x82\0" /* offset 11600 */
- "\xe8\x93\xbc\0" /* offset 11604 */
- "\xe9\x81\xbc\0" /* offset 11608 */
- "\xe6\x9a\x88\0" /* offset 11612 */
- "\xe9\x98\xae\0" /* offset 11616 */
- "\xe5\x8a\x89\0" /* offset 11620 */
- "\xe6\x9d\xbb\0" /* offset 11624 */
- "\xe6\x9f\xb3\0" /* offset 11628 */
- "\xe6\xb5\x81\0" /* offset 11632 */
- "\xe6\xba\x9c\0" /* offset 11636 */
- "\xe7\x90\x89\0" /* offset 11640 */
- "\xe7\x95\x99\0" /* offset 11644 */
- "\xe7\xa1\xab\0" /* offset 11648 */
- "\xe7\xb4\x90\0" /* offset 11652 */
- "\xe9\xa1\x9e\0" /* offset 11656 */
- "\xe6\x88\xae\0" /* offset 11660 */
- "\xe9\x99\xb8\0" /* offset 11664 */
- "\xe5\x80\xab\0" /* offset 11668 */
- "\xe5\xb4\x99\0" /* offset 11672 */
- "\xe6\xb7\xaa\0" /* offset 11676 */
- "\xe8\xbc\xaa\0" /* offset 11680 */
- "\xe5\xbe\x8b\0" /* offset 11684 */
- "\xe6\x85\x84\0" /* offset 11688 */
- "\xe6\xa0\x97\0" /* offset 11692 */
- "\xe9\x9a\x86\0" /* offset 11696 */
- "\xe5\x88\xa9\0" /* offset 11700 */
- "\xe5\x90\x8f\0" /* offset 11704 */
- "\xe5\xb1\xa5\0" /* offset 11708 */
- "\xe6\x98\x93\0" /* offset 11712 */
- "\xe6\x9d\x8e\0" /* offset 11716 */
- "\xe6\xa2\xa8\0" /* offset 11720 */
- "\xe6\xb3\xa5\0" /* offset 11724 */
- "\xe7\x90\x86\0" /* offset 11728 */
- "\xe7\x97\xa2\0" /* offset 11732 */
- "\xe7\xbd\xb9\0" /* offset 11736 */
- "\xe8\xa3\x8f\0" /* offset 11740 */
- "\xe8\xa3\xa1\0" /* offset 11744 */
- "\xe9\x9b\xa2\0" /* offset 11748 */
- "\xe5\x8c\xbf\0" /* offset 11752 */
- "\xe6\xba\xba\0" /* offset 11756 */
- "\xe5\x90\x9d\0" /* offset 11760 */
- "\xe7\x87\x90\0" /* offset 11764 */
- "\xe7\x92\x98\0" /* offset 11768 */
- "\xe8\x97\xba\0" /* offset 11772 */
- "\xe9\x9a\xa3\0" /* offset 11776 */
- "\xe9\xb1\x97\0" /* offset 11780 */
- "\xe9\xba\x9f\0" /* offset 11784 */
- "\xe6\x9e\x97\0" /* offset 11788 */
- "\xe6\xb7\x8b\0" /* offset 11792 */
- "\xe8\x87\xa8\0" /* offset 11796 */
- "\xe7\xac\xa0\0" /* offset 11800 */
- "\xe7\xb2\x92\0" /* offset 11804 */
- "\xe7\x8b\x80\0" /* offset 11808 */
- "\xe7\x82\x99\0" /* offset 11812 */
- "\xe8\xad\x98\0" /* offset 11816 */
- "\xe4\xbb\x80\0" /* offset 11820 */
- "\xe8\x8c\xb6\0" /* offset 11824 */
- "\xe5\x88\xba\0" /* offset 11828 */
- "\xe5\x88\x87\0" /* offset 11832 */
- "\xe5\xba\xa6\0" /* offset 11836 */
- "\xe6\x8b\x93\0" /* offset 11840 */
- "\xe7\xb3\x96\0" /* offset 11844 */
- "\xe5\xae\x85\0" /* offset 11848 */
- "\xe6\xb4\x9e\0" /* offset 11852 */
- "\xe6\x9a\xb4\0" /* offset 11856 */
- "\xe8\xbc\xbb\0" /* offset 11860 */
- "\xe9\x99\x8d\0" /* offset 11864 */
- "\xe5\xbb\x93\0" /* offset 11868 */
- "\xe5\x85\x80\0" /* offset 11872 */
- "\xe5\x97\x80\0" /* offset 11876 */
- "\xe5\xa1\x9a\0" /* offset 11880 */
- "\xe6\x99\xb4\0" /* offset 11884 */
- "\xe5\x87\x9e\0" /* offset 11888 */
- "\xe7\x8c\xaa\0" /* offset 11892 */
- "\xe7\x9b\x8a\0" /* offset 11896 */
- "\xe7\xa4\xbc\0" /* offset 11900 */
- "\xe7\xa5\x9e\0" /* offset 11904 */
- "\xe7\xa5\xa5\0" /* offset 11908 */
- "\xe7\xa6\x8f\0" /* offset 11912 */
- "\xe9\x9d\x96\0" /* offset 11916 */
- "\xe7\xb2\xbe\0" /* offset 11920 */
- "\xe8\x98\x92\0" /* offset 11924 */
- "\xe8\xab\xb8\0" /* offset 11928 */
- "\xe9\x80\xb8\0" /* offset 11932 */
- "\xe9\x83\xbd\0" /* offset 11936 */
- "\xe9\xa3\xaf\0" /* offset 11940 */
- "\xe9\xa3\xbc\0" /* offset 11944 */
- "\xe9\xa4\xa8\0" /* offset 11948 */
- "\xe9\xb6\xb4\0" /* offset 11952 */
- "\xe4\xbe\xae\0" /* offset 11956 */
- "\xe5\x83\xa7\0" /* offset 11960 */
- "\xe5\x85\x8d\0" /* offset 11964 */
- "\xe5\x8b\x89\0" /* offset 11968 */
- "\xe5\x8b\xa4\0" /* offset 11972 */
- "\xe5\x8d\x91\0" /* offset 11976 */
- "\xe5\x96\x9d\0" /* offset 11980 */
- "\xe5\x98\x86\0" /* offset 11984 */
- "\xe5\x99\xa8\0" /* offset 11988 */
- "\xe5\xa1\x80\0" /* offset 11992 */
- "\xe5\xa2\xa8\0" /* offset 11996 */
- "\xe5\xb1\xa4\0" /* offset 12000 */
- "\xe6\x82\x94\0" /* offset 12004 */
- "\xe6\x85\xa8\0" /* offset 12008 */
- "\xe6\x86\x8e\0" /* offset 12012 */
- "\xe6\x87\xb2\0" /* offset 12016 */
- "\xe6\x95\x8f\0" /* offset 12020 */
- "\xe6\x97\xa2\0" /* offset 12024 */
- "\xe6\x9a\x91\0" /* offset 12028 */
- "\xe6\xa2\x85\0" /* offset 12032 */
- "\xe6\xb5\xb7\0" /* offset 12036 */
- "\xe6\xb8\x9a\0" /* offset 12040 */
- "\xe6\xbc\xa2\0" /* offset 12044 */
- "\xe7\x85\xae\0" /* offset 12048 */
- "\xe7\x88\xab\0" /* offset 12052 */
- "\xe7\x90\xa2\0" /* offset 12056 */
- "\xe7\xa2\x91\0" /* offset 12060 */
- "\xe7\xa5\x89\0" /* offset 12064 */
- "\xe7\xa5\x88\0" /* offset 12068 */
- "\xe7\xa5\x90\0" /* offset 12072 */
- "\xe7\xa5\x96\0" /* offset 12076 */
- "\xe7\xa6\x8d\0" /* offset 12080 */
- "\xe7\xa6\x8e\0" /* offset 12084 */
- "\xe7\xa9\x80\0" /* offset 12088 */
- "\xe7\xaa\x81\0" /* offset 12092 */
- "\xe7\xaf\x80\0" /* offset 12096 */
- "\xe7\xb8\x89\0" /* offset 12100 */
- "\xe7\xb9\x81\0" /* offset 12104 */
- "\xe7\xbd\xb2\0" /* offset 12108 */
- "\xe8\x80\x85\0" /* offset 12112 */
- "\xe8\x87\xad\0" /* offset 12116 */
- "\xe8\x89\xb9\0" /* offset 12120 */
- "\xe8\x91\x97\0" /* offset 12124 */
- "\xe8\xa4\x90\0" /* offset 12128 */
- "\xe8\xa6\x96\0" /* offset 12132 */
- "\xe8\xac\x81\0" /* offset 12136 */
- "\xe8\xac\xb9\0" /* offset 12140 */
- "\xe8\xb3\x93\0" /* offset 12144 */
- "\xe8\xb4\x88\0" /* offset 12148 */
- "\xe8\xbe\xb6\0" /* offset 12152 */
- "\xe9\x9b\xa3\0" /* offset 12156 */
- "\xe9\x9f\xbf\0" /* offset 12160 */
- "\xe9\xa0\xbb\0" /* offset 12164 */
- "\xe6\x81\xb5\0" /* offset 12168 */
- "\xf0\xa4\x8b\xae\0" /* offset 12172 */
- "\xe8\x88\x98\0" /* offset 12177 */
- "\xe4\xb8\xa6\0" /* offset 12181 */
- "\xe5\x86\xb5\0" /* offset 12185 */
- "\xe5\x85\xa8\0" /* offset 12189 */
- "\xe4\xbe\x80\0" /* offset 12193 */
- "\xe5\x85\x85\0" /* offset 12197 */
- "\xe5\x86\x80\0" /* offset 12201 */
- "\xe5\x8b\x87\0" /* offset 12205 */
- "\xe5\x8b\xba\0" /* offset 12209 */
- "\xe5\x95\x95\0" /* offset 12213 */
- "\xe5\x96\x99\0" /* offset 12217 */
- "\xe5\x97\xa2\0" /* offset 12221 */
- "\xe5\xa2\xb3\0" /* offset 12225 */
- "\xe5\xa5\x84\0" /* offset 12229 */
- "\xe5\xa5\x94\0" /* offset 12233 */
- "\xe5\xa9\xa2\0" /* offset 12237 */
- "\xe5\xac\xa8\0" /* offset 12241 */
- "\xe5\xbb\x92\0" /* offset 12245 */
- "\xe5\xbb\x99\0" /* offset 12249 */
- "\xe5\xbd\xa9\0" /* offset 12253 */
- "\xe5\xbe\xad\0" /* offset 12257 */
- "\xe6\x83\x98\0" /* offset 12261 */
- "\xe6\x85\x8e\0" /* offset 12265 */
- "\xe6\x84\x88\0" /* offset 12269 */
- "\xe6\x85\xa0\0" /* offset 12273 */
- "\xe6\x88\xb4\0" /* offset 12277 */
- "\xe6\x8f\x84\0" /* offset 12281 */
- "\xe6\x90\x9c\0" /* offset 12285 */
- "\xe6\x91\x92\0" /* offset 12289 */
- "\xe6\x95\x96\0" /* offset 12293 */
- "\xe6\x9c\x9b\0" /* offset 12297 */
- "\xe6\x9d\x96\0" /* offset 12301 */
- "\xe6\xbb\x9b\0" /* offset 12305 */
- "\xe6\xbb\x8b\0" /* offset 12309 */
- "\xe7\x80\x9e\0" /* offset 12313 */
- "\xe7\x9e\xa7\0" /* offset 12317 */
- "\xe7\x88\xb5\0" /* offset 12321 */
- "\xe7\x8a\xaf\0" /* offset 12325 */
- "\xe7\x91\xb1\0" /* offset 12329 */
- "\xe7\x94\x86\0" /* offset 12333 */
- "\xe7\x94\xbb\0" /* offset 12337 */
- "\xe7\x98\x9d\0" /* offset 12341 */
- "\xe7\x98\x9f\0" /* offset 12345 */
- "\xe7\x9b\x9b\0" /* offset 12349 */
- "\xe7\x9b\xb4\0" /* offset 12353 */
- "\xe7\x9d\x8a\0" /* offset 12357 */
- "\xe7\x9d\x80\0" /* offset 12361 */
- "\xe7\xa3\x8c\0" /* offset 12365 */
- "\xe7\xaa\xb1\0" /* offset 12369 */
- "\xe7\xb1\xbb\0" /* offset 12373 */
- "\xe7\xb5\x9b\0" /* offset 12377 */
- "\xe7\xbc\xbe\0" /* offset 12381 */
- "\xe8\x8d\x92\0" /* offset 12385 */
- "\xe8\x8f\xaf\0" /* offset 12389 */
- "\xe8\x9d\xb9\0" /* offset 12393 */
- "\xe8\xa5\x81\0" /* offset 12397 */
- "\xe8\xa6\x86\0" /* offset 12401 */
- "\xe8\xaa\xbf\0" /* offset 12405 */
- "\xe8\xab\x8b\0" /* offset 12409 */
- "\xe8\xab\xad\0" /* offset 12413 */
- "\xe8\xae\x8a\0" /* offset 12417 */
- "\xe8\xbc\xb8\0" /* offset 12421 */
- "\xe9\x81\xb2\0" /* offset 12425 */
- "\xe9\x86\x99\0" /* offset 12429 */
- "\xe9\x89\xb6\0" /* offset 12433 */
- "\xe9\x99\xbc\0" /* offset 12437 */
- "\xe9\x9f\x9b\0" /* offset 12441 */
- "\xe9\xa0\x8b\0" /* offset 12445 */
- "\xe9\xac\x92\0" /* offset 12449 */
- "\xf0\xa2\xa1\x8a\0" /* offset 12453 */
- "\xf0\xa2\xa1\x84\0" /* offset 12458 */
- "\xf0\xa3\x8f\x95\0" /* offset 12463 */
- "\xe3\xae\x9d\0" /* offset 12468 */
- "\xe4\x80\x98\0" /* offset 12472 */
- "\xe4\x80\xb9\0" /* offset 12476 */
- "\xf0\xa5\x89\x89\0" /* offset 12480 */
- "\xf0\xa5\xb3\x90\0" /* offset 12485 */
- "\xf0\xa7\xbb\x93\0" /* offset 12490 */
- "\xe9\xbd\x83\0" /* offset 12495 */
- "\xe9\xbe\x8e\0" /* offset 12499 */
- "\x66\x66\0" /* offset 12503 */
- "\x66\x69\0" /* offset 12506 */
- "\x66\x6c\0" /* offset 12509 */
- "\x66\x66\x69\0" /* offset 12512 */
- "\x66\x66\x6c\0" /* offset 12516 */
- "\x73\x74\0" /* offset 12520 */
- "\xd5\xb4\xd5\xb6\0" /* offset 12523 */
- "\xd5\xb4\xd5\xa5\0" /* offset 12528 */
- "\xd5\xb4\xd5\xab\0" /* offset 12533 */
- "\xd5\xbe\xd5\xb6\0" /* offset 12538 */
- "\xd5\xb4\xd5\xad\0" /* offset 12543 */
- "\xd7\x99\xd6\xb4\0" /* offset 12548 */
- "\xd7\xb2\xd6\xb7\0" /* offset 12553 */
- "\xd7\xa2\0" /* offset 12558 */
- "\xd7\x94\0" /* offset 12561 */
- "\xd7\x9b\0" /* offset 12564 */
- "\xd7\x9c\0" /* offset 12567 */
- "\xd7\x9d\0" /* offset 12570 */
- "\xd7\xa8\0" /* offset 12573 */
- "\xd7\xaa\0" /* offset 12576 */
- "\xd7\xa9\xd7\x81\0" /* offset 12579 */
- "\xd7\xa9\xd7\x82\0" /* offset 12584 */
- "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 12589 */
- "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 12596 */
- "\xd7\x90\xd6\xb7\0" /* offset 12603 */
- "\xd7\x90\xd6\xb8\0" /* offset 12608 */
- "\xd7\x90\xd6\xbc\0" /* offset 12613 */
- "\xd7\x91\xd6\xbc\0" /* offset 12618 */
- "\xd7\x92\xd6\xbc\0" /* offset 12623 */
- "\xd7\x93\xd6\xbc\0" /* offset 12628 */
- "\xd7\x94\xd6\xbc\0" /* offset 12633 */
- "\xd7\x95\xd6\xbc\0" /* offset 12638 */
- "\xd7\x96\xd6\xbc\0" /* offset 12643 */
- "\xd7\x98\xd6\xbc\0" /* offset 12648 */
- "\xd7\x99\xd6\xbc\0" /* offset 12653 */
- "\xd7\x9a\xd6\xbc\0" /* offset 12658 */
- "\xd7\x9b\xd6\xbc\0" /* offset 12663 */
- "\xd7\x9c\xd6\xbc\0" /* offset 12668 */
- "\xd7\x9e\xd6\xbc\0" /* offset 12673 */
- "\xd7\xa0\xd6\xbc\0" /* offset 12678 */
- "\xd7\xa1\xd6\xbc\0" /* offset 12683 */
- "\xd7\xa3\xd6\xbc\0" /* offset 12688 */
- "\xd7\xa4\xd6\xbc\0" /* offset 12693 */
- "\xd7\xa6\xd6\xbc\0" /* offset 12698 */
- "\xd7\xa7\xd6\xbc\0" /* offset 12703 */
- "\xd7\xa8\xd6\xbc\0" /* offset 12708 */
- "\xd7\xa9\xd6\xbc\0" /* offset 12713 */
- "\xd7\xaa\xd6\xbc\0" /* offset 12718 */
- "\xd7\x95\xd6\xb9\0" /* offset 12723 */
- "\xd7\x91\xd6\xbf\0" /* offset 12728 */
- "\xd7\x9b\xd6\xbf\0" /* offset 12733 */
- "\xd7\xa4\xd6\xbf\0" /* offset 12738 */
- "\xd7\x90\xd7\x9c\0" /* offset 12743 */
- "\xd9\xb1\0" /* offset 12748 */
- "\xd9\xbb\0" /* offset 12751 */
- "\xd9\xbe\0" /* offset 12754 */
- "\xda\x80\0" /* offset 12757 */
- "\xd9\xba\0" /* offset 12760 */
- "\xd9\xbf\0" /* offset 12763 */
- "\xd9\xb9\0" /* offset 12766 */
- "\xda\xa4\0" /* offset 12769 */
- "\xda\xa6\0" /* offset 12772 */
- "\xda\x84\0" /* offset 12775 */
- "\xda\x83\0" /* offset 12778 */
- "\xda\x86\0" /* offset 12781 */
- "\xda\x87\0" /* offset 12784 */
- "\xda\x8d\0" /* offset 12787 */
- "\xda\x8c\0" /* offset 12790 */
- "\xda\x8e\0" /* offset 12793 */
- "\xda\x88\0" /* offset 12796 */
- "\xda\x98\0" /* offset 12799 */
- "\xda\x91\0" /* offset 12802 */
- "\xda\xa9\0" /* offset 12805 */
- "\xda\xaf\0" /* offset 12808 */
- "\xda\xb3\0" /* offset 12811 */
- "\xda\xb1\0" /* offset 12814 */
- "\xda\xba\0" /* offset 12817 */
- "\xda\xbb\0" /* offset 12820 */
- "\xdb\x81\0" /* offset 12823 */
- "\xda\xbe\0" /* offset 12826 */
- "\xdb\x92\0" /* offset 12829 */
- "\xda\xad\0" /* offset 12832 */
- "\xdb\x87\0" /* offset 12835 */
- "\xdb\x86\0" /* offset 12838 */
- "\xdb\x88\0" /* offset 12841 */
- "\xdb\x8b\0" /* offset 12844 */
- "\xdb\x85\0" /* offset 12847 */
- "\xdb\x89\0" /* offset 12850 */
- "\xdb\x90\0" /* offset 12853 */
- "\xd9\x89\0" /* offset 12856 */
- "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12859 */
- "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12866 */
- "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12873 */
- "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12880 */
- "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12887 */
- "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12894 */
- "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12901 */
- "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12908 */
- "\xdb\x8c\0" /* offset 12915 */
- "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12918 */
- "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12925 */
- "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12932 */
- "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12939 */
- "\xd8\xa8\xd8\xac\0" /* offset 12946 */
- "\xd8\xa8\xd8\xad\0" /* offset 12951 */
- "\xd8\xa8\xd8\xae\0" /* offset 12956 */
- "\xd8\xa8\xd9\x85\0" /* offset 12961 */
- "\xd8\xa8\xd9\x89\0" /* offset 12966 */
- "\xd8\xa8\xd9\x8a\0" /* offset 12971 */
- "\xd8\xaa\xd8\xac\0" /* offset 12976 */
- "\xd8\xaa\xd8\xad\0" /* offset 12981 */
- "\xd8\xaa\xd8\xae\0" /* offset 12986 */
- "\xd8\xaa\xd9\x85\0" /* offset 12991 */
- "\xd8\xaa\xd9\x89\0" /* offset 12996 */
- "\xd8\xaa\xd9\x8a\0" /* offset 13001 */
- "\xd8\xab\xd8\xac\0" /* offset 13006 */
- "\xd8\xab\xd9\x85\0" /* offset 13011 */
- "\xd8\xab\xd9\x89\0" /* offset 13016 */
- "\xd8\xab\xd9\x8a\0" /* offset 13021 */
- "\xd8\xac\xd8\xad\0" /* offset 13026 */
- "\xd8\xac\xd9\x85\0" /* offset 13031 */
- "\xd8\xad\xd8\xac\0" /* offset 13036 */
- "\xd8\xad\xd9\x85\0" /* offset 13041 */
- "\xd8\xae\xd8\xac\0" /* offset 13046 */
- "\xd8\xae\xd8\xad\0" /* offset 13051 */
- "\xd8\xae\xd9\x85\0" /* offset 13056 */
- "\xd8\xb3\xd8\xac\0" /* offset 13061 */
- "\xd8\xb3\xd8\xad\0" /* offset 13066 */
- "\xd8\xb3\xd8\xae\0" /* offset 13071 */
- "\xd8\xb3\xd9\x85\0" /* offset 13076 */
- "\xd8\xb5\xd8\xad\0" /* offset 13081 */
- "\xd8\xb5\xd9\x85\0" /* offset 13086 */
- "\xd8\xb6\xd8\xac\0" /* offset 13091 */
- "\xd8\xb6\xd8\xad\0" /* offset 13096 */
- "\xd8\xb6\xd8\xae\0" /* offset 13101 */
- "\xd8\xb6\xd9\x85\0" /* offset 13106 */
- "\xd8\xb7\xd8\xad\0" /* offset 13111 */
- "\xd8\xb7\xd9\x85\0" /* offset 13116 */
- "\xd8\xb8\xd9\x85\0" /* offset 13121 */
- "\xd8\xb9\xd8\xac\0" /* offset 13126 */
- "\xd8\xb9\xd9\x85\0" /* offset 13131 */
- "\xd8\xba\xd8\xac\0" /* offset 13136 */
- "\xd8\xba\xd9\x85\0" /* offset 13141 */
- "\xd9\x81\xd8\xac\0" /* offset 13146 */
- "\xd9\x81\xd8\xad\0" /* offset 13151 */
- "\xd9\x81\xd8\xae\0" /* offset 13156 */
- "\xd9\x81\xd9\x85\0" /* offset 13161 */
- "\xd9\x81\xd9\x89\0" /* offset 13166 */
- "\xd9\x81\xd9\x8a\0" /* offset 13171 */
- "\xd9\x82\xd8\xad\0" /* offset 13176 */
- "\xd9\x82\xd9\x85\0" /* offset 13181 */
- "\xd9\x82\xd9\x89\0" /* offset 13186 */
- "\xd9\x82\xd9\x8a\0" /* offset 13191 */
- "\xd9\x83\xd8\xa7\0" /* offset 13196 */
- "\xd9\x83\xd8\xac\0" /* offset 13201 */
- "\xd9\x83\xd8\xad\0" /* offset 13206 */
- "\xd9\x83\xd8\xae\0" /* offset 13211 */
- "\xd9\x83\xd9\x84\0" /* offset 13216 */
- "\xd9\x83\xd9\x85\0" /* offset 13221 */
- "\xd9\x83\xd9\x89\0" /* offset 13226 */
- "\xd9\x83\xd9\x8a\0" /* offset 13231 */
- "\xd9\x84\xd8\xac\0" /* offset 13236 */
- "\xd9\x84\xd8\xad\0" /* offset 13241 */
- "\xd9\x84\xd8\xae\0" /* offset 13246 */
- "\xd9\x84\xd9\x85\0" /* offset 13251 */
- "\xd9\x84\xd9\x89\0" /* offset 13256 */
- "\xd9\x84\xd9\x8a\0" /* offset 13261 */
- "\xd9\x85\xd8\xac\0" /* offset 13266 */
- "\xd9\x85\xd8\xad\0" /* offset 13271 */
- "\xd9\x85\xd8\xae\0" /* offset 13276 */
- "\xd9\x85\xd9\x85\0" /* offset 13281 */
- "\xd9\x85\xd9\x89\0" /* offset 13286 */
- "\xd9\x85\xd9\x8a\0" /* offset 13291 */
- "\xd9\x86\xd8\xac\0" /* offset 13296 */
- "\xd9\x86\xd8\xad\0" /* offset 13301 */
- "\xd9\x86\xd8\xae\0" /* offset 13306 */
- "\xd9\x86\xd9\x85\0" /* offset 13311 */
- "\xd9\x86\xd9\x89\0" /* offset 13316 */
- "\xd9\x86\xd9\x8a\0" /* offset 13321 */
- "\xd9\x87\xd8\xac\0" /* offset 13326 */
- "\xd9\x87\xd9\x85\0" /* offset 13331 */
- "\xd9\x87\xd9\x89\0" /* offset 13336 */
- "\xd9\x87\xd9\x8a\0" /* offset 13341 */
- "\xd9\x8a\xd8\xac\0" /* offset 13346 */
- "\xd9\x8a\xd8\xad\0" /* offset 13351 */
- "\xd9\x8a\xd8\xae\0" /* offset 13356 */
- "\xd9\x8a\xd9\x85\0" /* offset 13361 */
- "\xd9\x8a\xd9\x89\0" /* offset 13366 */
- "\xd9\x8a\xd9\x8a\0" /* offset 13371 */
- "\xd8\xb0\xd9\xb0\0" /* offset 13376 */
- "\xd8\xb1\xd9\xb0\0" /* offset 13381 */
- "\xd9\x89\xd9\xb0\0" /* offset 13386 */
- "\x20\xd9\x8c\xd9\x91\0" /* offset 13391 */
- "\x20\xd9\x8d\xd9\x91\0" /* offset 13397 */
- "\x20\xd9\x8e\xd9\x91\0" /* offset 13403 */
- "\x20\xd9\x8f\xd9\x91\0" /* offset 13409 */
- "\x20\xd9\x90\xd9\x91\0" /* offset 13415 */
- "\x20\xd9\x91\xd9\xb0\0" /* offset 13421 */
- "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 13427 */
- "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 13434 */
- "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 13441 */
- "\xd8\xa8\xd8\xb1\0" /* offset 13448 */
- "\xd8\xa8\xd8\xb2\0" /* offset 13453 */
- "\xd8\xa8\xd9\x86\0" /* offset 13458 */
- "\xd8\xaa\xd8\xb1\0" /* offset 13463 */
- "\xd8\xaa\xd8\xb2\0" /* offset 13468 */
- "\xd8\xaa\xd9\x86\0" /* offset 13473 */
- "\xd8\xab\xd8\xb1\0" /* offset 13478 */
- "\xd8\xab\xd8\xb2\0" /* offset 13483 */
- "\xd8\xab\xd9\x86\0" /* offset 13488 */
- "\xd9\x85\xd8\xa7\0" /* offset 13493 */
- "\xd9\x86\xd8\xb1\0" /* offset 13498 */
- "\xd9\x86\xd8\xb2\0" /* offset 13503 */
- "\xd9\x86\xd9\x86\0" /* offset 13508 */
- "\xd9\x8a\xd8\xb1\0" /* offset 13513 */
- "\xd9\x8a\xd8\xb2\0" /* offset 13518 */
- "\xd9\x8a\xd9\x86\0" /* offset 13523 */
- "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 13528 */
- "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 13535 */
- "\xd8\xa8\xd9\x87\0" /* offset 13542 */
- "\xd8\xaa\xd9\x87\0" /* offset 13547 */
- "\xd8\xb5\xd8\xae\0" /* offset 13552 */
- "\xd9\x84\xd9\x87\0" /* offset 13557 */
- "\xd9\x86\xd9\x87\0" /* offset 13562 */
- "\xd9\x87\xd9\xb0\0" /* offset 13567 */
- "\xd9\x8a\xd9\x87\0" /* offset 13572 */
- "\xd8\xab\xd9\x87\0" /* offset 13577 */
- "\xd8\xb3\xd9\x87\0" /* offset 13582 */
- "\xd8\xb4\xd9\x85\0" /* offset 13587 */
- "\xd8\xb4\xd9\x87\0" /* offset 13592 */
- "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 13597 */
- "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 13604 */
- "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 13611 */
- "\xd8\xb7\xd9\x89\0" /* offset 13618 */
- "\xd8\xb7\xd9\x8a\0" /* offset 13623 */
- "\xd8\xb9\xd9\x89\0" /* offset 13628 */
- "\xd8\xb9\xd9\x8a\0" /* offset 13633 */
- "\xd8\xba\xd9\x89\0" /* offset 13638 */
- "\xd8\xba\xd9\x8a\0" /* offset 13643 */
- "\xd8\xb3\xd9\x89\0" /* offset 13648 */
- "\xd8\xb3\xd9\x8a\0" /* offset 13653 */
- "\xd8\xb4\xd9\x89\0" /* offset 13658 */
- "\xd8\xb4\xd9\x8a\0" /* offset 13663 */
- "\xd8\xad\xd9\x89\0" /* offset 13668 */
- "\xd8\xad\xd9\x8a\0" /* offset 13673 */
- "\xd8\xac\xd9\x89\0" /* offset 13678 */
- "\xd8\xac\xd9\x8a\0" /* offset 13683 */
- "\xd8\xae\xd9\x89\0" /* offset 13688 */
- "\xd8\xae\xd9\x8a\0" /* offset 13693 */
- "\xd8\xb5\xd9\x89\0" /* offset 13698 */
- "\xd8\xb5\xd9\x8a\0" /* offset 13703 */
- "\xd8\xb6\xd9\x89\0" /* offset 13708 */
- "\xd8\xb6\xd9\x8a\0" /* offset 13713 */
- "\xd8\xb4\xd8\xac\0" /* offset 13718 */
- "\xd8\xb4\xd8\xad\0" /* offset 13723 */
- "\xd8\xb4\xd8\xae\0" /* offset 13728 */
- "\xd8\xb4\xd8\xb1\0" /* offset 13733 */
- "\xd8\xb3\xd8\xb1\0" /* offset 13738 */
- "\xd8\xb5\xd8\xb1\0" /* offset 13743 */
- "\xd8\xb6\xd8\xb1\0" /* offset 13748 */
- "\xd8\xa7\xd9\x8b\0" /* offset 13753 */
- "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13758 */
- "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13765 */
- "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13772 */
- "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13779 */
- "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13786 */
- "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13793 */
- "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13800 */
- "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13807 */
- "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13814 */
- "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13821 */
- "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13828 */
- "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13835 */
- "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13842 */
- "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13849 */
- "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13856 */
- "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13863 */
- "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13870 */
- "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13877 */
- "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13884 */
- "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13891 */
- "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13898 */
- "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13905 */
- "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13912 */
- "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13919 */
- "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13926 */
- "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13933 */
- "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13940 */
- "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13947 */
- "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13954 */
- "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13961 */
- "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13968 */
- "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13975 */
- "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13982 */
- "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 13989 */
- "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 13996 */
- "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 14003 */
- "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 14010 */
- "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 14017 */
- "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 14024 */
- "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 14031 */
- "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 14038 */
- "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 14045 */
- "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 14052 */
- "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 14059 */
- "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 14066 */
- "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 14073 */
- "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 14080 */
- "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 14087 */
- "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 14094 */
- "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 14101 */
- "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 14108 */
- "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 14115 */
- "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 14122 */
- "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 14129 */
- "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 14136 */
- "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 14143 */
- "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 14150 */
- "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 14157 */
- "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 14164 */
- "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 14171 */
- "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 14178 */
- "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 14185 */
- "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 14192 */
- "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 14199 */
- "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 14206 */
- "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 14213 */
- "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 14220 */
- "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 14227 */
- "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 14234 */
- "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 14241 */
- "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 14248 */
- "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 14255 */
- "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 14262 */
- "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 14269 */
- "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 14276 */
- "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 14283 */
- "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 14290 */
- "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 14297 */
- "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 14304 */
- "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 14311 */
- "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 14318 */
- "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 14325 */
- "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 14332 */
- "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 14339 */
- "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 14346 */
- "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 14353 */
- "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 14360 */
- "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 14367 */
- "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 14374 */
- "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 14381 */
- "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 14388 */
- "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 14395 */
- "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 14402 */
- "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 14409 */
- "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 14416 */
- "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 14423 */
- "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 14430 */
- "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 14439 */
- "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 14448 */
- "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 14457 */
- "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 14466 */
- "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 14475 */
- "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14484 */
- "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 14493 */
- "\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 14500 */
- "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 14534 */
- "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 14550 */
- "\x2c\0" /* offset 14559 */
- "\xe3\x80\x81\0" /* offset 14561 */
- "\xe3\x80\x82\0" /* offset 14565 */
- "\x3a\0" /* offset 14569 */
- "\x21\0" /* offset 14571 */
- "\x3f\0" /* offset 14573 */
- "\xe3\x80\x96\0" /* offset 14575 */
- "\xe3\x80\x97\0" /* offset 14579 */
- "\xe2\x80\x94\0" /* offset 14583 */
- "\xe2\x80\x93\0" /* offset 14587 */
- "\x5f\0" /* offset 14591 */
- "\x7b\0" /* offset 14593 */
- "\x7d\0" /* offset 14595 */
- "\xe3\x80\x94\0" /* offset 14597 */
- "\xe3\x80\x95\0" /* offset 14601 */
- "\xe3\x80\x90\0" /* offset 14605 */
- "\xe3\x80\x91\0" /* offset 14609 */
- "\xe3\x80\x8a\0" /* offset 14613 */
- "\xe3\x80\x8b\0" /* offset 14617 */
- "\xe3\x80\x8c\0" /* offset 14621 */
- "\xe3\x80\x8d\0" /* offset 14625 */
- "\xe3\x80\x8e\0" /* offset 14629 */
- "\xe3\x80\x8f\0" /* offset 14633 */
- "\x5b\0" /* offset 14637 */
- "\x5d\0" /* offset 14639 */
- "\x23\0" /* offset 14641 */
- "\x26\0" /* offset 14643 */
- "\x2a\0" /* offset 14645 */
- "\x2d\0" /* offset 14647 */
- "\x3c\0" /* offset 14649 */
- "\x3e\0" /* offset 14651 */
- "\x5c\0" /* offset 14653 */
- "\x24\0" /* offset 14655 */
- "\x25\0" /* offset 14657 */
- "\x40\0" /* offset 14659 */
- "\x20\xd9\x8b\0" /* offset 14661 */
- "\xd9\x80\xd9\x8b\0" /* offset 14665 */
- "\x20\xd9\x8c\0" /* offset 14670 */
- "\x20\xd9\x8d\0" /* offset 14674 */
- "\x20\xd9\x8e\0" /* offset 14678 */
- "\xd9\x80\xd9\x8e\0" /* offset 14682 */
- "\x20\xd9\x8f\0" /* offset 14687 */
- "\xd9\x80\xd9\x8f\0" /* offset 14691 */
- "\x20\xd9\x90\0" /* offset 14696 */
- "\xd9\x80\xd9\x90\0" /* offset 14700 */
- "\x20\xd9\x91\0" /* offset 14705 */
- "\xd9\x80\xd9\x91\0" /* offset 14709 */
- "\x20\xd9\x92\0" /* offset 14714 */
- "\xd9\x80\xd9\x92\0" /* offset 14718 */
- "\xd8\xa1\0" /* offset 14723 */
- "\xd8\xa7\0" /* offset 14726 */
- "\xd8\xa8\0" /* offset 14729 */
- "\xd8\xa9\0" /* offset 14732 */
- "\xd8\xaa\0" /* offset 14735 */
- "\xd8\xab\0" /* offset 14738 */
- "\xd8\xac\0" /* offset 14741 */
- "\xd8\xad\0" /* offset 14744 */
- "\xd8\xae\0" /* offset 14747 */
- "\xd8\xaf\0" /* offset 14750 */
- "\xd8\xb0\0" /* offset 14753 */
- "\xd8\xb1\0" /* offset 14756 */
- "\xd8\xb2\0" /* offset 14759 */
- "\xd8\xb3\0" /* offset 14762 */
- "\xd8\xb4\0" /* offset 14765 */
- "\xd8\xb5\0" /* offset 14768 */
- "\xd8\xb6\0" /* offset 14771 */
- "\xd8\xb7\0" /* offset 14774 */
- "\xd8\xb8\0" /* offset 14777 */
- "\xd8\xb9\0" /* offset 14780 */
- "\xd8\xba\0" /* offset 14783 */
- "\xd9\x81\0" /* offset 14786 */
- "\xd9\x82\0" /* offset 14789 */
- "\xd9\x83\0" /* offset 14792 */
- "\xd9\x84\0" /* offset 14795 */
- "\xd9\x85\0" /* offset 14798 */
- "\xd9\x86\0" /* offset 14801 */
- "\xd9\x87\0" /* offset 14804 */
- "\xd9\x88\0" /* offset 14807 */
- "\xd9\x8a\0" /* offset 14810 */
- "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14813 */
- "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14820 */
- "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14827 */
- "\xd9\x84\xd8\xa7\0" /* offset 14834 */
- "\x22\0" /* offset 14839 */
- "\x27\0" /* offset 14841 */
- "\x2f\0" /* offset 14843 */
- "\x5e\0" /* offset 14845 */
- "\x7c\0" /* offset 14847 */
- "\x7e\0" /* offset 14849 */
- "\xe2\xa6\x85\0" /* offset 14851 */
- "\xe2\xa6\x86\0" /* offset 14855 */
- "\xe3\x83\xbb\0" /* offset 14859 */
- "\xe3\x82\xa1\0" /* offset 14863 */
- "\xe3\x82\xa3\0" /* offset 14867 */
- "\xe3\x82\xa5\0" /* offset 14871 */
- "\xe3\x82\xa7\0" /* offset 14875 */
- "\xe3\x82\xa9\0" /* offset 14879 */
- "\xe3\x83\xa3\0" /* offset 14883 */
- "\xe3\x83\xa5\0" /* offset 14887 */
- "\xe3\x83\xa7\0" /* offset 14891 */
- "\xe3\x83\x83\0" /* offset 14895 */
- "\xe3\x83\xbc\0" /* offset 14899 */
- "\xe3\x83\xb3\0" /* offset 14903 */
- "\xe3\x82\x99\0" /* offset 14907 */
- "\xe3\x82\x9a\0" /* offset 14911 */
- "\xc2\xa2\0" /* offset 14915 */
- "\xc2\xa3\0" /* offset 14918 */
- "\xc2\xac\0" /* offset 14921 */
- "\xc2\xa6\0" /* offset 14924 */
- "\xc2\xa5\0" /* offset 14927 */
- "\xe2\x82\xa9\0" /* offset 14930 */
- "\xe2\x94\x82\0" /* offset 14934 */
- "\xe2\x86\x90\0" /* offset 14938 */
- "\xe2\x86\x91\0" /* offset 14942 */
- "\xe2\x86\x92\0" /* offset 14946 */
- "\xe2\x86\x93\0" /* offset 14950 */
- "\xe2\x96\xa0\0" /* offset 14954 */
- "\xe2\x97\x8b\0" /* offset 14958 */
- "\xf0\x91\x82\x99\xf0\x91\x82\xba\0" /* offset 14962 */
- "\xf0\x91\x82\x9b\xf0\x91\x82\xba\0" /* offset 14971 */
- "\xf0\x91\x82\xa5\xf0\x91\x82\xba\0" /* offset 14980 */
- "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 14989 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 14998 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15007 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15020 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 15033 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 15046 */
- "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 15059 */
- "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 15072 */
- "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 15081 */
- "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15090 */
- "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15103 */
- "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15116 */
- "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15129 */
- "\xc4\xb1\0" /* offset 15142 */
- "\xc8\xb7\0" /* offset 15145 */
- "\xce\x91\0" /* offset 15148 */
- "\xce\x92\0" /* offset 15151 */
- "\xce\x94\0" /* offset 15154 */
- "\xce\x95\0" /* offset 15157 */
- "\xce\x96\0" /* offset 15160 */
- "\xce\x97\0" /* offset 15163 */
- "\xce\x99\0" /* offset 15166 */
- "\xce\x9a\0" /* offset 15169 */
- "\xce\x9b\0" /* offset 15172 */
- "\xce\x9c\0" /* offset 15175 */
- "\xce\x9d\0" /* offset 15178 */
- "\xce\x9e\0" /* offset 15181 */
- "\xce\x9f\0" /* offset 15184 */
- "\xce\xa1\0" /* offset 15187 */
- "\xce\xa4\0" /* offset 15190 */
- "\xce\xa6\0" /* offset 15193 */
- "\xce\xa7\0" /* offset 15196 */
- "\xce\xa8\0" /* offset 15199 */
- "\xe2\x88\x87\0" /* offset 15202 */
- "\xce\xb1\0" /* offset 15206 */
- "\xce\xb6\0" /* offset 15209 */
- "\xce\xb7\0" /* offset 15212 */
- "\xce\xbb\0" /* offset 15215 */
- "\xce\xbd\0" /* offset 15218 */
- "\xce\xbe\0" /* offset 15221 */
- "\xce\xbf\0" /* offset 15224 */
- "\xcf\x83\0" /* offset 15227 */
- "\xcf\x84\0" /* offset 15230 */
- "\xcf\x85\0" /* offset 15233 */
- "\xcf\x88\0" /* offset 15236 */
- "\xcf\x89\0" /* offset 15239 */
- "\xe2\x88\x82\0" /* offset 15242 */
- "\xcf\x9c\0" /* offset 15246 */
- "\xcf\x9d\0" /* offset 15249 */
- "\x30\x2e\0" /* offset 15252 */
- "\x30\x2c\0" /* offset 15255 */
- "\x31\x2c\0" /* offset 15258 */
- "\x32\x2c\0" /* offset 15261 */
- "\x33\x2c\0" /* offset 15264 */
- "\x34\x2c\0" /* offset 15267 */
- "\x35\x2c\0" /* offset 15270 */
- "\x36\x2c\0" /* offset 15273 */
- "\x37\x2c\0" /* offset 15276 */
- "\x38\x2c\0" /* offset 15279 */
- "\x39\x2c\0" /* offset 15282 */
- "\x28\x41\x29\0" /* offset 15285 */
- "\x28\x42\x29\0" /* offset 15289 */
- "\x28\x43\x29\0" /* offset 15293 */
- "\x28\x44\x29\0" /* offset 15297 */
- "\x28\x45\x29\0" /* offset 15301 */
- "\x28\x46\x29\0" /* offset 15305 */
- "\x28\x47\x29\0" /* offset 15309 */
- "\x28\x48\x29\0" /* offset 15313 */
- "\x28\x49\x29\0" /* offset 15317 */
- "\x28\x4a\x29\0" /* offset 15321 */
- "\x28\x4b\x29\0" /* offset 15325 */
- "\x28\x4c\x29\0" /* offset 15329 */
- "\x28\x4d\x29\0" /* offset 15333 */
- "\x28\x4e\x29\0" /* offset 15337 */
- "\x28\x4f\x29\0" /* offset 15341 */
- "\x28\x50\x29\0" /* offset 15345 */
- "\x28\x51\x29\0" /* offset 15349 */
- "\x28\x52\x29\0" /* offset 15353 */
- "\x28\x53\x29\0" /* offset 15357 */
- "\x28\x54\x29\0" /* offset 15361 */
- "\x28\x55\x29\0" /* offset 15365 */
- "\x28\x56\x29\0" /* offset 15369 */
- "\x28\x57\x29\0" /* offset 15373 */
- "\x28\x58\x29\0" /* offset 15377 */
- "\x28\x59\x29\0" /* offset 15381 */
- "\x28\x5a\x29\0" /* offset 15385 */
- "\xe3\x80\x94\x53\xe3\x80\x95\0" /* offset 15389 */
- "\x43\x44\0" /* offset 15397 */
- "\x57\x5a\0" /* offset 15400 */
- "\x48\x56\0" /* offset 15403 */
- "\x53\x44\0" /* offset 15406 */
- "\x53\x53\0" /* offset 15409 */
- "\x50\x50\x56\0" /* offset 15412 */
- "\x57\x43\0" /* offset 15416 */
- "\x44\x4a\0" /* offset 15419 */
- "\xe3\x81\xbb\xe3\x81\x8b\0" /* offset 15422 */
- "\xe3\x82\xb3\xe3\x82\xb3\0" /* offset 15429 */
- "\xe5\xad\x97\0" /* offset 15436 */
- "\xe5\x8f\x8c\0" /* offset 15440 */
- "\xe5\xa4\x9a\0" /* offset 15444 */
- "\xe8\xa7\xa3\0" /* offset 15448 */
- "\xe4\xba\xa4\0" /* offset 15452 */
- "\xe6\x98\xa0\0" /* offset 15456 */
- "\xe7\x84\xa1\0" /* offset 15460 */
- "\xe5\x89\x8d\0" /* offset 15464 */
- "\xe5\xbe\x8c\0" /* offset 15468 */
- "\xe5\x86\x8d\0" /* offset 15472 */
- "\xe6\x96\xb0\0" /* offset 15476 */
- "\xe5\x88\x9d\0" /* offset 15480 */
- "\xe7\xb5\x82\0" /* offset 15484 */
- "\xe8\xb2\xa9\0" /* offset 15488 */
- "\xe5\xa3\xb0\0" /* offset 15492 */
- "\xe5\x90\xb9\0" /* offset 15496 */
- "\xe6\xbc\x94\0" /* offset 15500 */
- "\xe6\x8a\x95\0" /* offset 15504 */
- "\xe6\x8d\x95\0" /* offset 15508 */
- "\xe9\x81\x8a\0" /* offset 15512 */
- "\xe6\x8c\x87\0" /* offset 15516 */
- "\xe6\x89\x93\0" /* offset 15520 */
- "\xe7\xa6\x81\0" /* offset 15524 */
- "\xe7\xa9\xba\0" /* offset 15528 */
- "\xe5\x90\x88\0" /* offset 15532 */
- "\xe6\xba\x80\0" /* offset 15536 */
- "\xe7\x94\xb3\0" /* offset 15540 */
- "\xe5\x89\xb2\0" /* offset 15544 */
- "\xe5\x96\xb6\0" /* offset 15548 */
- "\xe3\x80\x94\xe6\x9c\xac\xe3\x80\x95\0" /* offset 15552 */
- "\xe3\x80\x94\xe4\xb8\x89\xe3\x80\x95\0" /* offset 15562 */
- "\xe3\x80\x94\xe4\xba\x8c\xe3\x80\x95\0" /* offset 15572 */
- "\xe3\x80\x94\xe5\xae\x89\xe3\x80\x95\0" /* offset 15582 */
- "\xe3\x80\x94\xe7\x82\xb9\xe3\x80\x95\0" /* offset 15592 */
- "\xe3\x80\x94\xe6\x89\x93\xe3\x80\x95\0" /* offset 15602 */
- "\xe3\x80\x94\xe7\x9b\x97\xe3\x80\x95\0" /* offset 15612 */
- "\xe3\x80\x94\xe5\x8b\x9d\xe3\x80\x95\0" /* offset 15622 */
- "\xe3\x80\x94\xe6\x95\x97\xe3\x80\x95\0" /* offset 15632 */
- "\xe5\xbe\x97\0" /* offset 15642 */
- "\xe5\x8f\xaf\0" /* offset 15646 */
- "\xe4\xb8\xbd\0" /* offset 15650 */
- "\xe4\xb8\xb8\0" /* offset 15654 */
- "\xe4\xb9\x81\0" /* offset 15658 */
- "\xf0\xa0\x84\xa2\0" /* offset 15662 */
- "\xe4\xbd\xa0\0" /* offset 15667 */
- "\xe4\xbe\xbb\0" /* offset 15671 */
- "\xe5\x80\x82\0" /* offset 15675 */
- "\xe5\x81\xba\0" /* offset 15679 */
- "\xe5\x82\x99\0" /* offset 15683 */
- "\xe5\x83\x8f\0" /* offset 15687 */
- "\xe3\x92\x9e\0" /* offset 15691 */
- "\xf0\xa0\x98\xba\0" /* offset 15695 */
- "\xe5\x85\x94\0" /* offset 15700 */
- "\xe5\x85\xa4\0" /* offset 15704 */
- "\xe5\x85\xb7\0" /* offset 15708 */
- "\xf0\xa0\x94\x9c\0" /* offset 15712 */
- "\xe3\x92\xb9\0" /* offset 15717 */
- "\xe5\x85\xa7\0" /* offset 15721 */
- "\xf0\xa0\x95\x8b\0" /* offset 15725 */
- "\xe5\x86\x97\0" /* offset 15730 */
- "\xe5\x86\xa4\0" /* offset 15734 */
- "\xe4\xbb\x8c\0" /* offset 15738 */
- "\xe5\x86\xac\0" /* offset 15742 */
- "\xf0\xa9\x87\x9f\0" /* offset 15746 */
- "\xe5\x88\x83\0" /* offset 15751 */
- "\xe3\x93\x9f\0" /* offset 15755 */
- "\xe5\x88\xbb\0" /* offset 15759 */
- "\xe5\x89\x86\0" /* offset 15763 */
- "\xe5\x89\xb7\0" /* offset 15767 */
- "\xe3\x94\x95\0" /* offset 15771 */
- "\xe5\x8c\x85\0" /* offset 15775 */
- "\xe5\x8c\x86\0" /* offset 15779 */
- "\xe5\x8d\x89\0" /* offset 15783 */
- "\xe5\x8d\x9a\0" /* offset 15787 */
- "\xe5\x8d\xb3\0" /* offset 15791 */
- "\xe5\x8d\xbd\0" /* offset 15795 */
- "\xe5\x8d\xbf\0" /* offset 15799 */
- "\xf0\xa0\xa8\xac\0" /* offset 15803 */
- "\xe7\x81\xb0\0" /* offset 15808 */
- "\xe5\x8f\x8a\0" /* offset 15812 */
- "\xe5\x8f\x9f\0" /* offset 15816 */
- "\xf0\xa0\xad\xa3\0" /* offset 15820 */
- "\xe5\x8f\xab\0" /* offset 15825 */
- "\xe5\x8f\xb1\0" /* offset 15829 */
- "\xe5\x90\x86\0" /* offset 15833 */
- "\xe5\x92\x9e\0" /* offset 15837 */
- "\xe5\x90\xb8\0" /* offset 15841 */
- "\xe5\x91\x88\0" /* offset 15845 */
- "\xe5\x91\xa8\0" /* offset 15849 */
- "\xe5\x92\xa2\0" /* offset 15853 */
- "\xe5\x93\xb6\0" /* offset 15857 */
- "\xe5\x94\x90\0" /* offset 15861 */
- "\xe5\x95\x93\0" /* offset 15865 */
- "\xe5\x95\xa3\0" /* offset 15869 */
- "\xe5\x96\x84\0" /* offset 15873 */
- "\xe5\x96\xab\0" /* offset 15877 */
- "\xe5\x96\xb3\0" /* offset 15881 */
- "\xe5\x97\x82\0" /* offset 15885 */
- "\xe5\x9c\x96\0" /* offset 15889 */
- "\xe5\x9c\x97\0" /* offset 15893 */
- "\xe5\x99\x91\0" /* offset 15897 */
- "\xe5\x99\xb4\0" /* offset 15901 */
- "\xe5\xa3\xae\0" /* offset 15905 */
- "\xe5\x9f\x8e\0" /* offset 15909 */
- "\xe5\x9f\xb4\0" /* offset 15913 */
- "\xe5\xa0\x8d\0" /* offset 15917 */
- "\xe5\x9e\x8b\0" /* offset 15921 */
- "\xe5\xa0\xb2\0" /* offset 15925 */
- "\xe5\xa0\xb1\0" /* offset 15929 */
- "\xe5\xa2\xac\0" /* offset 15933 */
- "\xf0\xa1\x93\xa4\0" /* offset 15937 */
- "\xe5\xa3\xb2\0" /* offset 15942 */
- "\xe5\xa3\xb7\0" /* offset 15946 */
- "\xe5\xa4\x86\0" /* offset 15950 */
- "\xe5\xa4\xa2\0" /* offset 15954 */
- "\xe5\xa5\xa2\0" /* offset 15958 */
- "\xf0\xa1\x9a\xa8\0" /* offset 15962 */
- "\xf0\xa1\x9b\xaa\0" /* offset 15967 */
- "\xe5\xa7\xac\0" /* offset 15972 */
- "\xe5\xa8\x9b\0" /* offset 15976 */
- "\xe5\xa8\xa7\0" /* offset 15980 */
- "\xe5\xa7\x98\0" /* offset 15984 */
- "\xe5\xa9\xa6\0" /* offset 15988 */
- "\xe3\x9b\xae\0" /* offset 15992 */
- "\xe3\x9b\xbc\0" /* offset 15996 */
- "\xe5\xac\x88\0" /* offset 16000 */
- "\xe5\xac\xbe\0" /* offset 16004 */
- "\xf0\xa1\xa7\x88\0" /* offset 16008 */
- "\xe5\xaf\x83\0" /* offset 16013 */
- "\xe5\xaf\x98\0" /* offset 16017 */
- "\xe5\xaf\xb3\0" /* offset 16021 */
- "\xf0\xa1\xac\x98\0" /* offset 16025 */
- "\xe5\xaf\xbf\0" /* offset 16030 */
- "\xe5\xb0\x86\0" /* offset 16034 */
- "\xe5\xbd\x93\0" /* offset 16038 */
- "\xe3\x9e\x81\0" /* offset 16042 */
- "\xe5\xb1\xa0\0" /* offset 16046 */
- "\xe5\xb3\x80\0" /* offset 16050 */
- "\xe5\xb2\x8d\0" /* offset 16054 */
- "\xf0\xa1\xb7\xa4\0" /* offset 16058 */
- "\xe5\xb5\x83\0" /* offset 16063 */
- "\xf0\xa1\xb7\xa6\0" /* offset 16067 */
- "\xe5\xb5\xae\0" /* offset 16072 */
- "\xe5\xb5\xab\0" /* offset 16076 */
- "\xe5\xb5\xbc\0" /* offset 16080 */
- "\xe5\xb7\xa1\0" /* offset 16084 */
- "\xe5\xb7\xa2\0" /* offset 16088 */
- "\xe3\xa0\xaf\0" /* offset 16092 */
- "\xe5\xb7\xbd\0" /* offset 16096 */
- "\xe5\xb8\xa8\0" /* offset 16100 */
- "\xe5\xb8\xbd\0" /* offset 16104 */
- "\xe5\xb9\xa9\0" /* offset 16108 */
- "\xe3\xa1\xa2\0" /* offset 16112 */
- "\xf0\xa2\x86\x83\0" /* offset 16116 */
- "\xe3\xa1\xbc\0" /* offset 16121 */
- "\xe5\xba\xb0\0" /* offset 16125 */
- "\xe5\xba\xb3\0" /* offset 16129 */
- "\xe5\xba\xb6\0" /* offset 16133 */
- "\xf0\xaa\x8e\x92\0" /* offset 16137 */
- "\xf0\xa2\x8c\xb1\0" /* offset 16142 */
- "\xe8\x88\x81\0" /* offset 16147 */
- "\xe5\xbc\xa2\0" /* offset 16151 */
- "\xe3\xa3\x87\0" /* offset 16155 */
- "\xf0\xa3\x8a\xb8\0" /* offset 16159 */
- "\xf0\xa6\x87\x9a\0" /* offset 16164 */
- "\xe5\xbd\xa2\0" /* offset 16169 */
- "\xe5\xbd\xab\0" /* offset 16173 */
- "\xe3\xa3\xa3\0" /* offset 16177 */
- "\xe5\xbe\x9a\0" /* offset 16181 */
- "\xe5\xbf\x8d\0" /* offset 16185 */
- "\xe5\xbf\x97\0" /* offset 16189 */
- "\xe5\xbf\xb9\0" /* offset 16193 */
- "\xe6\x82\x81\0" /* offset 16197 */
- "\xe3\xa4\xba\0" /* offset 16201 */
- "\xe3\xa4\x9c\0" /* offset 16205 */
- "\xf0\xa2\x9b\x94\0" /* offset 16209 */
- "\xe6\x83\x87\0" /* offset 16214 */
- "\xe6\x85\x88\0" /* offset 16218 */
- "\xe6\x85\x8c\0" /* offset 16222 */
- "\xe6\x85\xba\0" /* offset 16226 */
- "\xe6\x86\xb2\0" /* offset 16230 */
- "\xe6\x86\xa4\0" /* offset 16234 */
- "\xe6\x86\xaf\0" /* offset 16238 */
- "\xe6\x87\x9e\0" /* offset 16242 */
- "\xe6\x88\x90\0" /* offset 16246 */
- "\xe6\x88\x9b\0" /* offset 16250 */
- "\xe6\x89\x9d\0" /* offset 16254 */
- "\xe6\x8a\xb1\0" /* offset 16258 */
- "\xe6\x8b\x94\0" /* offset 16262 */
- "\xe6\x8d\x90\0" /* offset 16266 */
- "\xf0\xa2\xac\x8c\0" /* offset 16270 */
- "\xe6\x8c\xbd\0" /* offset 16275 */
- "\xe6\x8b\xbc\0" /* offset 16279 */
- "\xe6\x8d\xa8\0" /* offset 16283 */
- "\xe6\x8e\x83\0" /* offset 16287 */
- "\xe6\x8f\xa4\0" /* offset 16291 */
- "\xf0\xa2\xaf\xb1\0" /* offset 16295 */
- "\xe6\x90\xa2\0" /* offset 16300 */
- "\xe6\x8f\x85\0" /* offset 16304 */
- "\xe6\x8e\xa9\0" /* offset 16308 */
- "\xe3\xa8\xae\0" /* offset 16312 */
- "\xe6\x91\xa9\0" /* offset 16316 */
- "\xe6\x91\xbe\0" /* offset 16320 */
- "\xe6\x92\x9d\0" /* offset 16324 */
- "\xe6\x91\xb7\0" /* offset 16328 */
- "\xe3\xa9\xac\0" /* offset 16332 */
- "\xe6\x95\xac\0" /* offset 16336 */
- "\xf0\xa3\x80\x8a\0" /* offset 16340 */
- "\xe6\x97\xa3\0" /* offset 16345 */
- "\xe6\x9b\xb8\0" /* offset 16349 */
- "\xe6\x99\x89\0" /* offset 16353 */
- "\xe3\xac\x99\0" /* offset 16357 */
- "\xe3\xac\x88\0" /* offset 16361 */
- "\xe3\xab\xa4\0" /* offset 16365 */
- "\xe5\x86\x92\0" /* offset 16369 */
- "\xe5\x86\x95\0" /* offset 16373 */
- "\xe6\x9c\x80\0" /* offset 16377 */
- "\xe6\x9a\x9c\0" /* offset 16381 */
- "\xe8\x82\xad\0" /* offset 16385 */
- "\xe4\x8f\x99\0" /* offset 16389 */
- "\xe6\x9c\xa1\0" /* offset 16393 */
- "\xe6\x9d\x9e\0" /* offset 16397 */
- "\xe6\x9d\x93\0" /* offset 16401 */
- "\xf0\xa3\x8f\x83\0" /* offset 16405 */
- "\xe3\xad\x89\0" /* offset 16410 */
- "\xe6\x9f\xba\0" /* offset 16414 */
- "\xe6\x9e\x85\0" /* offset 16418 */
- "\xe6\xa1\x92\0" /* offset 16422 */
- "\xf0\xa3\x91\xad\0" /* offset 16426 */
- "\xe6\xa2\x8e\0" /* offset 16431 */
- "\xe6\xa0\x9f\0" /* offset 16435 */
- "\xe6\xa4\x94\0" /* offset 16439 */
- "\xe6\xa5\x82\0" /* offset 16443 */
- "\xe6\xa6\xa3\0" /* offset 16447 */
- "\xe6\xa7\xaa\0" /* offset 16451 */
- "\xe6\xaa\xa8\0" /* offset 16455 */
- "\xf0\xa3\x9a\xa3\0" /* offset 16459 */
- "\xe6\xab\x9b\0" /* offset 16464 */
- "\xe3\xb0\x98\0" /* offset 16468 */
- "\xe6\xac\xa1\0" /* offset 16472 */
- "\xf0\xa3\xa2\xa7\0" /* offset 16476 */
- "\xe6\xad\x94\0" /* offset 16481 */
- "\xe3\xb1\x8e\0" /* offset 16485 */
- "\xe6\xad\xb2\0" /* offset 16489 */
- "\xe6\xae\x9f\0" /* offset 16493 */
- "\xe6\xae\xbb\0" /* offset 16497 */
- "\xf0\xa3\xaa\x8d\0" /* offset 16501 */
- "\xf0\xa1\xb4\x8b\0" /* offset 16506 */
- "\xf0\xa3\xab\xba\0" /* offset 16511 */
- "\xe6\xb1\x8e\0" /* offset 16516 */
- "\xf0\xa3\xb2\xbc\0" /* offset 16520 */
- "\xe6\xb2\xbf\0" /* offset 16525 */
- "\xe6\xb3\x8d\0" /* offset 16529 */
- "\xe6\xb1\xa7\0" /* offset 16533 */
- "\xe6\xb4\x96\0" /* offset 16537 */
- "\xe6\xb4\xbe\0" /* offset 16541 */
- "\xe6\xb5\xa9\0" /* offset 16545 */
- "\xe6\xb5\xb8\0" /* offset 16549 */
- "\xe6\xb6\x85\0" /* offset 16553 */
- "\xf0\xa3\xb4\x9e\0" /* offset 16557 */
- "\xe6\xb4\xb4\0" /* offset 16562 */
- "\xe6\xb8\xaf\0" /* offset 16566 */
- "\xe6\xb9\xae\0" /* offset 16570 */
- "\xe3\xb4\xb3\0" /* offset 16574 */
- "\xe6\xbb\x87\0" /* offset 16578 */
- "\xf0\xa3\xbb\x91\0" /* offset 16582 */
- "\xe6\xb7\xb9\0" /* offset 16587 */
- "\xe6\xbd\xae\0" /* offset 16591 */
- "\xf0\xa3\xbd\x9e\0" /* offset 16595 */
- "\xf0\xa3\xbe\x8e\0" /* offset 16600 */
- "\xe6\xbf\x86\0" /* offset 16605 */
- "\xe7\x80\xb9\0" /* offset 16609 */
- "\xe7\x80\x9b\0" /* offset 16613 */
- "\xe3\xb6\x96\0" /* offset 16617 */
- "\xe7\x81\x8a\0" /* offset 16621 */
- "\xe7\x81\xbd\0" /* offset 16625 */
- "\xe7\x81\xb7\0" /* offset 16629 */
- "\xe7\x82\xad\0" /* offset 16633 */
- "\xf0\xa0\x94\xa5\0" /* offset 16637 */
- "\xe7\x85\x85\0" /* offset 16642 */
- "\xf0\xa4\x89\xa3\0" /* offset 16646 */
- "\xe7\x86\x9c\0" /* offset 16651 */
- "\xf0\xa4\x8e\xab\0" /* offset 16655 */
- "\xe7\x88\xa8\0" /* offset 16660 */
- "\xe7\x89\x90\0" /* offset 16664 */
- "\xf0\xa4\x98\x88\0" /* offset 16668 */
- "\xe7\x8a\x80\0" /* offset 16673 */
- "\xe7\x8a\x95\0" /* offset 16677 */
- "\xf0\xa4\x9c\xb5\0" /* offset 16681 */
- "\xf0\xa4\xa0\x94\0" /* offset 16686 */
- "\xe7\x8d\xba\0" /* offset 16691 */
- "\xe7\x8e\x8b\0" /* offset 16695 */
- "\xe3\xba\xac\0" /* offset 16699 */
- "\xe7\x8e\xa5\0" /* offset 16703 */
- "\xe3\xba\xb8\0" /* offset 16707 */
- "\xe7\x91\x87\0" /* offset 16711 */
- "\xe7\x91\x9c\0" /* offset 16715 */
- "\xe7\x92\x85\0" /* offset 16719 */
- "\xe7\x93\x8a\0" /* offset 16723 */
- "\xe3\xbc\x9b\0" /* offset 16727 */
- "\xe7\x94\xa4\0" /* offset 16731 */
- "\xf0\xa4\xb0\xb6\0" /* offset 16735 */
- "\xe7\x94\xbe\0" /* offset 16740 */
- "\xf0\xa4\xb2\x92\0" /* offset 16744 */
- "\xf0\xa2\x86\x9f\0" /* offset 16749 */
- "\xe7\x98\x90\0" /* offset 16754 */
- "\xf0\xa4\xbe\xa1\0" /* offset 16758 */
- "\xf0\xa4\xbe\xb8\0" /* offset 16763 */
- "\xf0\xa5\x81\x84\0" /* offset 16768 */
- "\xe3\xbf\xbc\0" /* offset 16773 */
- "\xe4\x80\x88\0" /* offset 16777 */
- "\xf0\xa5\x83\xb3\0" /* offset 16781 */
- "\xf0\xa5\x83\xb2\0" /* offset 16786 */
- "\xf0\xa5\x84\x99\0" /* offset 16791 */
- "\xf0\xa5\x84\xb3\0" /* offset 16796 */
- "\xe7\x9c\x9e\0" /* offset 16801 */
- "\xe7\x9c\x9f\0" /* offset 16805 */
- "\xe7\x9e\x8b\0" /* offset 16809 */
- "\xe4\x81\x86\0" /* offset 16813 */
- "\xe4\x82\x96\0" /* offset 16817 */
- "\xf0\xa5\x90\x9d\0" /* offset 16821 */
- "\xe7\xa1\x8e\0" /* offset 16826 */
- "\xe4\x83\xa3\0" /* offset 16830 */
- "\xf0\xa5\x98\xa6\0" /* offset 16834 */
- "\xf0\xa5\x9a\x9a\0" /* offset 16839 */
- "\xf0\xa5\x9b\x85\0" /* offset 16844 */
- "\xe7\xa7\xab\0" /* offset 16849 */
- "\xe4\x84\xaf\0" /* offset 16853 */
- "\xe7\xa9\x8a\0" /* offset 16857 */
- "\xe7\xa9\x8f\0" /* offset 16861 */
- "\xf0\xa5\xa5\xbc\0" /* offset 16865 */
- "\xf0\xa5\xaa\xa7\0" /* offset 16870 */
- "\xe7\xab\xae\0" /* offset 16875 */
- "\xe4\x88\x82\0" /* offset 16879 */
- "\xf0\xa5\xae\xab\0" /* offset 16883 */
- "\xe7\xaf\x86\0" /* offset 16888 */
- "\xe7\xaf\x89\0" /* offset 16892 */
- "\xe4\x88\xa7\0" /* offset 16896 */
- "\xf0\xa5\xb2\x80\0" /* offset 16900 */
- "\xe7\xb3\x92\0" /* offset 16905 */
- "\xe4\x8a\xa0\0" /* offset 16909 */
- "\xe7\xb3\xa8\0" /* offset 16913 */
- "\xe7\xb3\xa3\0" /* offset 16917 */
- "\xe7\xb4\x80\0" /* offset 16921 */
- "\xf0\xa5\xbe\x86\0" /* offset 16925 */
- "\xe7\xb5\xa3\0" /* offset 16930 */
- "\xe4\x8c\x81\0" /* offset 16934 */
- "\xe7\xb7\x87\0" /* offset 16938 */
- "\xe7\xb8\x82\0" /* offset 16942 */
- "\xe7\xb9\x85\0" /* offset 16946 */
- "\xe4\x8c\xb4\0" /* offset 16950 */
- "\xf0\xa6\x88\xa8\0" /* offset 16954 */
- "\xf0\xa6\x89\x87\0" /* offset 16959 */
- "\xe4\x8d\x99\0" /* offset 16964 */
- "\xf0\xa6\x8b\x99\0" /* offset 16968 */
- "\xe7\xbd\xba\0" /* offset 16973 */
- "\xf0\xa6\x8c\xbe\0" /* offset 16977 */
- "\xe7\xbe\x95\0" /* offset 16982 */
- "\xe7\xbf\xba\0" /* offset 16986 */
- "\xf0\xa6\x93\x9a\0" /* offset 16990 */
- "\xf0\xa6\x94\xa3\0" /* offset 16995 */
- "\xe8\x81\xa0\0" /* offset 17000 */
- "\xf0\xa6\x96\xa8\0" /* offset 17004 */
- "\xe8\x81\xb0\0" /* offset 17009 */
- "\xf0\xa3\x8d\x9f\0" /* offset 17013 */
- "\xe4\x8f\x95\0" /* offset 17018 */
- "\xe8\x82\xb2\0" /* offset 17022 */
- "\xe8\x84\x83\0" /* offset 17026 */
- "\xe4\x90\x8b\0" /* offset 17030 */
- "\xe8\x84\xbe\0" /* offset 17034 */
- "\xe5\xaa\xb5\0" /* offset 17038 */
- "\xf0\xa6\x9e\xa7\0" /* offset 17042 */
- "\xf0\xa6\x9e\xb5\0" /* offset 17047 */
- "\xf0\xa3\x8e\x93\0" /* offset 17052 */
- "\xf0\xa3\x8e\x9c\0" /* offset 17057 */
- "\xe8\x88\x84\0" /* offset 17062 */
- "\xe8\xbe\x9e\0" /* offset 17066 */
- "\xe4\x91\xab\0" /* offset 17070 */
- "\xe8\x8a\x91\0" /* offset 17074 */
- "\xe8\x8a\x8b\0" /* offset 17078 */
- "\xe8\x8a\x9d\0" /* offset 17082 */
- "\xe5\x8a\xb3\0" /* offset 17086 */
- "\xe8\x8a\xb1\0" /* offset 17090 */
- "\xe8\x8a\xb3\0" /* offset 17094 */
- "\xe8\x8a\xbd\0" /* offset 17098 */
- "\xe8\x8b\xa6\0" /* offset 17102 */
- "\xf0\xa6\xac\xbc\0" /* offset 17106 */
- "\xe8\x8c\x9d\0" /* offset 17111 */
- "\xe8\x8d\xa3\0" /* offset 17115 */
- "\xe8\x8e\xad\0" /* offset 17119 */
- "\xe8\x8c\xa3\0" /* offset 17123 */
- "\xe8\x8e\xbd\0" /* offset 17127 */
- "\xe8\x8f\xa7\0" /* offset 17131 */
- "\xe8\x8d\x93\0" /* offset 17135 */
- "\xe8\x8f\x8a\0" /* offset 17139 */
- "\xe8\x8f\x8c\0" /* offset 17143 */
- "\xe8\x8f\x9c\0" /* offset 17147 */
- "\xf0\xa6\xb0\xb6\0" /* offset 17151 */
- "\xf0\xa6\xb5\xab\0" /* offset 17156 */
- "\xf0\xa6\xb3\x95\0" /* offset 17161 */
- "\xe4\x94\xab\0" /* offset 17166 */
- "\xe8\x93\xb1\0" /* offset 17170 */
- "\xe8\x93\xb3\0" /* offset 17174 */
- "\xe8\x94\x96\0" /* offset 17178 */
- "\xf0\xa7\x8f\x8a\0" /* offset 17182 */
- "\xe8\x95\xa4\0" /* offset 17187 */
- "\xf0\xa6\xbc\xac\0" /* offset 17191 */
- "\xe4\x95\x9d\0" /* offset 17196 */
- "\xe4\x95\xa1\0" /* offset 17200 */
- "\xf0\xa6\xbe\xb1\0" /* offset 17204 */
- "\xf0\xa7\x83\x92\0" /* offset 17209 */
- "\xe4\x95\xab\0" /* offset 17214 */
- "\xe8\x99\x90\0" /* offset 17218 */
- "\xe8\x99\xa7\0" /* offset 17222 */
- "\xe8\x99\xa9\0" /* offset 17226 */
- "\xe8\x9a\xa9\0" /* offset 17230 */
- "\xe8\x9a\x88\0" /* offset 17234 */
- "\xe8\x9c\x8e\0" /* offset 17238 */
- "\xe8\x9b\xa2\0" /* offset 17242 */
- "\xe8\x9c\xa8\0" /* offset 17246 */
- "\xe8\x9d\xab\0" /* offset 17250 */
- "\xe8\x9e\x86\0" /* offset 17254 */
- "\xe4\x97\x97\0" /* offset 17258 */
- "\xe8\x9f\xa1\0" /* offset 17262 */
- "\xe8\xa0\x81\0" /* offset 17266 */
- "\xe4\x97\xb9\0" /* offset 17270 */
- "\xe8\xa1\xa0\0" /* offset 17274 */
- "\xf0\xa7\x99\xa7\0" /* offset 17278 */
- "\xe8\xa3\x97\0" /* offset 17283 */
- "\xe8\xa3\x9e\0" /* offset 17287 */
- "\xe4\x98\xb5\0" /* offset 17291 */
- "\xe8\xa3\xba\0" /* offset 17295 */
- "\xe3\x92\xbb\0" /* offset 17299 */
- "\xf0\xa7\xa2\xae\0" /* offset 17303 */
- "\xf0\xa7\xa5\xa6\0" /* offset 17308 */
- "\xe4\x9a\xbe\0" /* offset 17313 */
- "\xe4\x9b\x87\0" /* offset 17317 */
- "\xe8\xaa\xa0\0" /* offset 17321 */
- "\xf0\xa7\xb2\xa8\0" /* offset 17325 */
- "\xe8\xb2\xab\0" /* offset 17330 */
- "\xe8\xb3\x81\0" /* offset 17334 */
- "\xe8\xb4\x9b\0" /* offset 17338 */
- "\xe8\xb5\xb7\0" /* offset 17342 */
- "\xf0\xa7\xbc\xaf\0" /* offset 17346 */
- "\xf0\xa0\xa0\x84\0" /* offset 17351 */
- "\xe8\xb7\x8b\0" /* offset 17356 */
- "\xe8\xb6\xbc\0" /* offset 17360 */
- "\xe8\xb7\xb0\0" /* offset 17364 */
- "\xf0\xa0\xa3\x9e\0" /* offset 17368 */
- "\xe8\xbb\x94\0" /* offset 17373 */
- "\xf0\xa8\x97\x92\0" /* offset 17377 */
- "\xf0\xa8\x97\xad\0" /* offset 17382 */
- "\xe9\x82\x94\0" /* offset 17387 */
- "\xe9\x83\xb1\0" /* offset 17391 */
- "\xe9\x84\x91\0" /* offset 17395 */
- "\xf0\xa8\x9c\xae\0" /* offset 17399 */
- "\xe9\x84\x9b\0" /* offset 17404 */
- "\xe9\x88\xb8\0" /* offset 17408 */
- "\xe9\x8b\x97\0" /* offset 17412 */
- "\xe9\x8b\x98\0" /* offset 17416 */
- "\xe9\x89\xbc\0" /* offset 17420 */
- "\xe9\x8f\xb9\0" /* offset 17424 */
- "\xe9\x90\x95\0" /* offset 17428 */
- "\xf0\xa8\xaf\xba\0" /* offset 17432 */
- "\xe9\x96\x8b\0" /* offset 17437 */
- "\xe4\xa6\x95\0" /* offset 17441 */
- "\xe9\x96\xb7\0" /* offset 17445 */
- "\xf0\xa8\xb5\xb7\0" /* offset 17449 */
- "\xe4\xa7\xa6\0" /* offset 17454 */
- "\xe9\x9b\x83\0" /* offset 17458 */
- "\xe5\xb6\xb2\0" /* offset 17462 */
- "\xe9\x9c\xa3\0" /* offset 17466 */
- "\xf0\xa9\x85\x85\0" /* offset 17470 */
- "\xf0\xa9\x88\x9a\0" /* offset 17475 */
- "\xe4\xa9\xae\0" /* offset 17480 */
- "\xe4\xa9\xb6\0" /* offset 17484 */
- "\xe9\x9f\xa0\0" /* offset 17488 */
- "\xf0\xa9\x90\x8a\0" /* offset 17492 */
- "\xe4\xaa\xb2\0" /* offset 17497 */
- "\xf0\xa9\x92\x96\0" /* offset 17501 */
- "\xe9\xa0\xa9\0" /* offset 17506 */
- "\xf0\xa9\x96\xb6\0" /* offset 17510 */
- "\xe9\xa3\xa2\0" /* offset 17515 */
- "\xe4\xac\xb3\0" /* offset 17519 */
- "\xe9\xa4\xa9\0" /* offset 17523 */
- "\xe9\xa6\xa7\0" /* offset 17527 */
- "\xe9\xa7\x82\0" /* offset 17531 */
- "\xe9\xa7\xbe\0" /* offset 17535 */
- "\xe4\xaf\x8e\0" /* offset 17539 */
- "\xf0\xa9\xac\xb0\0" /* offset 17543 */
- "\xe9\xb1\x80\0" /* offset 17548 */
- "\xe9\xb3\xbd\0" /* offset 17552 */
- "\xe4\xb3\x8e\0" /* offset 17556 */
- "\xe4\xb3\xad\0" /* offset 17560 */
- "\xe9\xb5\xa7\0" /* offset 17564 */
- "\xf0\xaa\x83\x8e\0" /* offset 17568 */
- "\xe4\xb3\xb8\0" /* offset 17573 */
- "\xf0\xaa\x84\x85\0" /* offset 17577 */
- "\xf0\xaa\x88\x8e\0" /* offset 17582 */
- "\xf0\xaa\x8a\x91\0" /* offset 17587 */
- "\xe4\xb5\x96\0" /* offset 17592 */
- "\xe9\xbb\xbe\0" /* offset 17596 */
- "\xe9\xbc\x85\0" /* offset 17600 */
- "\xe9\xbc\x8f\0" /* offset 17604 */
- "\xe9\xbc\x96\0" /* offset 17608 */
- "\xf0\xaa\x98\x80\0" /* offset 17612 */;
+ "\xc4\xa6\0" /* offset 10880 */
+ "\xc5\x93\0" /* offset 10883 */
+ "\xe8\xb1\x88\0" /* offset 10886 */
+ "\xe6\x9b\xb4\0" /* offset 10890 */
+ "\xe8\xb3\x88\0" /* offset 10894 */
+ "\xe6\xbb\x91\0" /* offset 10898 */
+ "\xe4\xb8\xb2\0" /* offset 10902 */
+ "\xe5\x8f\xa5\0" /* offset 10906 */
+ "\xe5\xa5\x91\0" /* offset 10910 */
+ "\xe5\x96\x87\0" /* offset 10914 */
+ "\xe5\xa5\x88\0" /* offset 10918 */
+ "\xe6\x87\xb6\0" /* offset 10922 */
+ "\xe7\x99\xa9\0" /* offset 10926 */
+ "\xe7\xbe\x85\0" /* offset 10930 */
+ "\xe8\x98\xbf\0" /* offset 10934 */
+ "\xe8\x9e\xba\0" /* offset 10938 */
+ "\xe8\xa3\xb8\0" /* offset 10942 */
+ "\xe9\x82\x8f\0" /* offset 10946 */
+ "\xe6\xa8\x82\0" /* offset 10950 */
+ "\xe6\xb4\x9b\0" /* offset 10954 */
+ "\xe7\x83\x99\0" /* offset 10958 */
+ "\xe7\x8f\x9e\0" /* offset 10962 */
+ "\xe8\x90\xbd\0" /* offset 10966 */
+ "\xe9\x85\xaa\0" /* offset 10970 */
+ "\xe9\xa7\xb1\0" /* offset 10974 */
+ "\xe4\xba\x82\0" /* offset 10978 */
+ "\xe5\x8d\xb5\0" /* offset 10982 */
+ "\xe6\xac\x84\0" /* offset 10986 */
+ "\xe7\x88\x9b\0" /* offset 10990 */
+ "\xe8\x98\xad\0" /* offset 10994 */
+ "\xe9\xb8\x9e\0" /* offset 10998 */
+ "\xe5\xb5\x90\0" /* offset 11002 */
+ "\xe6\xbf\xab\0" /* offset 11006 */
+ "\xe8\x97\x8d\0" /* offset 11010 */
+ "\xe8\xa5\xa4\0" /* offset 11014 */
+ "\xe6\x8b\x89\0" /* offset 11018 */
+ "\xe8\x87\x98\0" /* offset 11022 */
+ "\xe8\xa0\x9f\0" /* offset 11026 */
+ "\xe5\xbb\x8a\0" /* offset 11030 */
+ "\xe6\x9c\x97\0" /* offset 11034 */
+ "\xe6\xb5\xaa\0" /* offset 11038 */
+ "\xe7\x8b\xbc\0" /* offset 11042 */
+ "\xe9\x83\x8e\0" /* offset 11046 */
+ "\xe4\xbe\x86\0" /* offset 11050 */
+ "\xe5\x86\xb7\0" /* offset 11054 */
+ "\xe5\x8b\x9e\0" /* offset 11058 */
+ "\xe6\x93\x84\0" /* offset 11062 */
+ "\xe6\xab\x93\0" /* offset 11066 */
+ "\xe7\x88\x90\0" /* offset 11070 */
+ "\xe7\x9b\xa7\0" /* offset 11074 */
+ "\xe8\x98\x86\0" /* offset 11078 */
+ "\xe8\x99\x9c\0" /* offset 11082 */
+ "\xe8\xb7\xaf\0" /* offset 11086 */
+ "\xe9\x9c\xb2\0" /* offset 11090 */
+ "\xe9\xad\xaf\0" /* offset 11094 */
+ "\xe9\xb7\xba\0" /* offset 11098 */
+ "\xe7\xa2\x8c\0" /* offset 11102 */
+ "\xe7\xa5\xbf\0" /* offset 11106 */
+ "\xe7\xb6\xa0\0" /* offset 11110 */
+ "\xe8\x8f\x89\0" /* offset 11114 */
+ "\xe9\x8c\x84\0" /* offset 11118 */
+ "\xe8\xab\x96\0" /* offset 11122 */
+ "\xe5\xa3\x9f\0" /* offset 11126 */
+ "\xe5\xbc\x84\0" /* offset 11130 */
+ "\xe7\xb1\xa0\0" /* offset 11134 */
+ "\xe8\x81\xbe\0" /* offset 11138 */
+ "\xe7\x89\xa2\0" /* offset 11142 */
+ "\xe7\xa3\x8a\0" /* offset 11146 */
+ "\xe8\xb3\x82\0" /* offset 11150 */
+ "\xe9\x9b\xb7\0" /* offset 11154 */
+ "\xe5\xa3\x98\0" /* offset 11158 */
+ "\xe5\xb1\xa2\0" /* offset 11162 */
+ "\xe6\xa8\x93\0" /* offset 11166 */
+ "\xe6\xb7\x9a\0" /* offset 11170 */
+ "\xe6\xbc\x8f\0" /* offset 11174 */
+ "\xe7\xb4\xaf\0" /* offset 11178 */
+ "\xe7\xb8\xb7\0" /* offset 11182 */
+ "\xe9\x99\x8b\0" /* offset 11186 */
+ "\xe5\x8b\x92\0" /* offset 11190 */
+ "\xe8\x82\x8b\0" /* offset 11194 */
+ "\xe5\x87\x9c\0" /* offset 11198 */
+ "\xe5\x87\x8c\0" /* offset 11202 */
+ "\xe7\xa8\x9c\0" /* offset 11206 */
+ "\xe7\xb6\xbe\0" /* offset 11210 */
+ "\xe8\x8f\xb1\0" /* offset 11214 */
+ "\xe9\x99\xb5\0" /* offset 11218 */
+ "\xe8\xae\x80\0" /* offset 11222 */
+ "\xe6\x8b\x8f\0" /* offset 11226 */
+ "\xe8\xab\xbe\0" /* offset 11230 */
+ "\xe4\xb8\xb9\0" /* offset 11234 */
+ "\xe5\xaf\xa7\0" /* offset 11238 */
+ "\xe6\x80\x92\0" /* offset 11242 */
+ "\xe7\x8e\x87\0" /* offset 11246 */
+ "\xe7\x95\xb0\0" /* offset 11250 */
+ "\xe5\x8c\x97\0" /* offset 11254 */
+ "\xe7\xa3\xbb\0" /* offset 11258 */
+ "\xe4\xbe\xbf\0" /* offset 11262 */
+ "\xe5\xbe\xa9\0" /* offset 11266 */
+ "\xe4\xb8\x8d\0" /* offset 11270 */
+ "\xe6\xb3\x8c\0" /* offset 11274 */
+ "\xe6\x95\xb8\0" /* offset 11278 */
+ "\xe7\xb4\xa2\0" /* offset 11282 */
+ "\xe5\x8f\x83\0" /* offset 11286 */
+ "\xe5\xa1\x9e\0" /* offset 11290 */
+ "\xe7\x9c\x81\0" /* offset 11294 */
+ "\xe8\x91\x89\0" /* offset 11298 */
+ "\xe8\xaa\xaa\0" /* offset 11302 */
+ "\xe6\xae\xba\0" /* offset 11306 */
+ "\xe6\xb2\x88\0" /* offset 11310 */
+ "\xe6\x8b\xbe\0" /* offset 11314 */
+ "\xe8\x8b\xa5\0" /* offset 11318 */
+ "\xe6\x8e\xa0\0" /* offset 11322 */
+ "\xe7\x95\xa5\0" /* offset 11326 */
+ "\xe4\xba\xae\0" /* offset 11330 */
+ "\xe5\x85\xa9\0" /* offset 11334 */
+ "\xe5\x87\x89\0" /* offset 11338 */
+ "\xe6\xa2\x81\0" /* offset 11342 */
+ "\xe7\xb3\xa7\0" /* offset 11346 */
+ "\xe8\x89\xaf\0" /* offset 11350 */
+ "\xe8\xab\x92\0" /* offset 11354 */
+ "\xe9\x87\x8f\0" /* offset 11358 */
+ "\xe5\x8b\xb5\0" /* offset 11362 */
+ "\xe5\x91\x82\0" /* offset 11366 */
+ "\xe5\xbb\xac\0" /* offset 11370 */
+ "\xe6\x97\x85\0" /* offset 11374 */
+ "\xe6\xbf\xbe\0" /* offset 11378 */
+ "\xe7\xa4\xaa\0" /* offset 11382 */
+ "\xe9\x96\xad\0" /* offset 11386 */
+ "\xe9\xa9\xaa\0" /* offset 11390 */
+ "\xe9\xba\x97\0" /* offset 11394 */
+ "\xe9\xbb\x8e\0" /* offset 11398 */
+ "\xe6\x9b\x86\0" /* offset 11402 */
+ "\xe6\xad\xb7\0" /* offset 11406 */
+ "\xe8\xbd\xa2\0" /* offset 11410 */
+ "\xe5\xb9\xb4\0" /* offset 11414 */
+ "\xe6\x86\x90\0" /* offset 11418 */
+ "\xe6\x88\x80\0" /* offset 11422 */
+ "\xe6\x92\x9a\0" /* offset 11426 */
+ "\xe6\xbc\xa3\0" /* offset 11430 */
+ "\xe7\x85\x89\0" /* offset 11434 */
+ "\xe7\x92\x89\0" /* offset 11438 */
+ "\xe7\xa7\x8a\0" /* offset 11442 */
+ "\xe7\xb7\xb4\0" /* offset 11446 */
+ "\xe8\x81\xaf\0" /* offset 11450 */
+ "\xe8\xbc\xa6\0" /* offset 11454 */
+ "\xe8\x93\xae\0" /* offset 11458 */
+ "\xe9\x80\xa3\0" /* offset 11462 */
+ "\xe9\x8d\x8a\0" /* offset 11466 */
+ "\xe5\x88\x97\0" /* offset 11470 */
+ "\xe5\x8a\xa3\0" /* offset 11474 */
+ "\xe5\x92\xbd\0" /* offset 11478 */
+ "\xe7\x83\x88\0" /* offset 11482 */
+ "\xe8\xa3\x82\0" /* offset 11486 */
+ "\xe5\xbb\x89\0" /* offset 11490 */
+ "\xe5\xbf\xb5\0" /* offset 11494 */
+ "\xe6\x8d\xbb\0" /* offset 11498 */
+ "\xe6\xae\xae\0" /* offset 11502 */
+ "\xe7\xb0\xbe\0" /* offset 11506 */
+ "\xe7\x8d\xb5\0" /* offset 11510 */
+ "\xe4\xbb\xa4\0" /* offset 11514 */
+ "\xe5\x9b\xb9\0" /* offset 11518 */
+ "\xe5\xb6\xba\0" /* offset 11522 */
+ "\xe6\x80\x9c\0" /* offset 11526 */
+ "\xe7\x8e\xb2\0" /* offset 11530 */
+ "\xe7\x91\xa9\0" /* offset 11534 */
+ "\xe7\xbe\x9a\0" /* offset 11538 */
+ "\xe8\x81\x86\0" /* offset 11542 */
+ "\xe9\x88\xb4\0" /* offset 11546 */
+ "\xe9\x9b\xb6\0" /* offset 11550 */
+ "\xe9\x9d\x88\0" /* offset 11554 */
+ "\xe9\xa0\x98\0" /* offset 11558 */
+ "\xe4\xbe\x8b\0" /* offset 11562 */
+ "\xe7\xa6\xae\0" /* offset 11566 */
+ "\xe9\x86\xb4\0" /* offset 11570 */
+ "\xe9\x9a\xb8\0" /* offset 11574 */
+ "\xe6\x83\xa1\0" /* offset 11578 */
+ "\xe4\xba\x86\0" /* offset 11582 */
+ "\xe5\x83\x9a\0" /* offset 11586 */
+ "\xe5\xaf\xae\0" /* offset 11590 */
+ "\xe5\xb0\xbf\0" /* offset 11594 */
+ "\xe6\x96\x99\0" /* offset 11598 */
+ "\xe7\x87\x8e\0" /* offset 11602 */
+ "\xe7\x99\x82\0" /* offset 11606 */
+ "\xe8\x93\xbc\0" /* offset 11610 */
+ "\xe9\x81\xbc\0" /* offset 11614 */
+ "\xe6\x9a\x88\0" /* offset 11618 */
+ "\xe9\x98\xae\0" /* offset 11622 */
+ "\xe5\x8a\x89\0" /* offset 11626 */
+ "\xe6\x9d\xbb\0" /* offset 11630 */
+ "\xe6\x9f\xb3\0" /* offset 11634 */
+ "\xe6\xb5\x81\0" /* offset 11638 */
+ "\xe6\xba\x9c\0" /* offset 11642 */
+ "\xe7\x90\x89\0" /* offset 11646 */
+ "\xe7\x95\x99\0" /* offset 11650 */
+ "\xe7\xa1\xab\0" /* offset 11654 */
+ "\xe7\xb4\x90\0" /* offset 11658 */
+ "\xe9\xa1\x9e\0" /* offset 11662 */
+ "\xe6\x88\xae\0" /* offset 11666 */
+ "\xe9\x99\xb8\0" /* offset 11670 */
+ "\xe5\x80\xab\0" /* offset 11674 */
+ "\xe5\xb4\x99\0" /* offset 11678 */
+ "\xe6\xb7\xaa\0" /* offset 11682 */
+ "\xe8\xbc\xaa\0" /* offset 11686 */
+ "\xe5\xbe\x8b\0" /* offset 11690 */
+ "\xe6\x85\x84\0" /* offset 11694 */
+ "\xe6\xa0\x97\0" /* offset 11698 */
+ "\xe9\x9a\x86\0" /* offset 11702 */
+ "\xe5\x88\xa9\0" /* offset 11706 */
+ "\xe5\x90\x8f\0" /* offset 11710 */
+ "\xe5\xb1\xa5\0" /* offset 11714 */
+ "\xe6\x98\x93\0" /* offset 11718 */
+ "\xe6\x9d\x8e\0" /* offset 11722 */
+ "\xe6\xa2\xa8\0" /* offset 11726 */
+ "\xe6\xb3\xa5\0" /* offset 11730 */
+ "\xe7\x90\x86\0" /* offset 11734 */
+ "\xe7\x97\xa2\0" /* offset 11738 */
+ "\xe7\xbd\xb9\0" /* offset 11742 */
+ "\xe8\xa3\x8f\0" /* offset 11746 */
+ "\xe8\xa3\xa1\0" /* offset 11750 */
+ "\xe9\x9b\xa2\0" /* offset 11754 */
+ "\xe5\x8c\xbf\0" /* offset 11758 */
+ "\xe6\xba\xba\0" /* offset 11762 */
+ "\xe5\x90\x9d\0" /* offset 11766 */
+ "\xe7\x87\x90\0" /* offset 11770 */
+ "\xe7\x92\x98\0" /* offset 11774 */
+ "\xe8\x97\xba\0" /* offset 11778 */
+ "\xe9\x9a\xa3\0" /* offset 11782 */
+ "\xe9\xb1\x97\0" /* offset 11786 */
+ "\xe9\xba\x9f\0" /* offset 11790 */
+ "\xe6\x9e\x97\0" /* offset 11794 */
+ "\xe6\xb7\x8b\0" /* offset 11798 */
+ "\xe8\x87\xa8\0" /* offset 11802 */
+ "\xe7\xac\xa0\0" /* offset 11806 */
+ "\xe7\xb2\x92\0" /* offset 11810 */
+ "\xe7\x8b\x80\0" /* offset 11814 */
+ "\xe7\x82\x99\0" /* offset 11818 */
+ "\xe8\xad\x98\0" /* offset 11822 */
+ "\xe4\xbb\x80\0" /* offset 11826 */
+ "\xe8\x8c\xb6\0" /* offset 11830 */
+ "\xe5\x88\xba\0" /* offset 11834 */
+ "\xe5\x88\x87\0" /* offset 11838 */
+ "\xe5\xba\xa6\0" /* offset 11842 */
+ "\xe6\x8b\x93\0" /* offset 11846 */
+ "\xe7\xb3\x96\0" /* offset 11850 */
+ "\xe5\xae\x85\0" /* offset 11854 */
+ "\xe6\xb4\x9e\0" /* offset 11858 */
+ "\xe6\x9a\xb4\0" /* offset 11862 */
+ "\xe8\xbc\xbb\0" /* offset 11866 */
+ "\xe9\x99\x8d\0" /* offset 11870 */
+ "\xe5\xbb\x93\0" /* offset 11874 */
+ "\xe5\x85\x80\0" /* offset 11878 */
+ "\xe5\x97\x80\0" /* offset 11882 */
+ "\xe5\xa1\x9a\0" /* offset 11886 */
+ "\xe6\x99\xb4\0" /* offset 11890 */
+ "\xe5\x87\x9e\0" /* offset 11894 */
+ "\xe7\x8c\xaa\0" /* offset 11898 */
+ "\xe7\x9b\x8a\0" /* offset 11902 */
+ "\xe7\xa4\xbc\0" /* offset 11906 */
+ "\xe7\xa5\x9e\0" /* offset 11910 */
+ "\xe7\xa5\xa5\0" /* offset 11914 */
+ "\xe7\xa6\x8f\0" /* offset 11918 */
+ "\xe9\x9d\x96\0" /* offset 11922 */
+ "\xe7\xb2\xbe\0" /* offset 11926 */
+ "\xe8\x98\x92\0" /* offset 11930 */
+ "\xe8\xab\xb8\0" /* offset 11934 */
+ "\xe9\x80\xb8\0" /* offset 11938 */
+ "\xe9\x83\xbd\0" /* offset 11942 */
+ "\xe9\xa3\xaf\0" /* offset 11946 */
+ "\xe9\xa3\xbc\0" /* offset 11950 */
+ "\xe9\xa4\xa8\0" /* offset 11954 */
+ "\xe9\xb6\xb4\0" /* offset 11958 */
+ "\xe9\x83\x9e\0" /* offset 11962 */
+ "\xe9\x9a\xb7\0" /* offset 11966 */
+ "\xe4\xbe\xae\0" /* offset 11970 */
+ "\xe5\x83\xa7\0" /* offset 11974 */
+ "\xe5\x85\x8d\0" /* offset 11978 */
+ "\xe5\x8b\x89\0" /* offset 11982 */
+ "\xe5\x8b\xa4\0" /* offset 11986 */
+ "\xe5\x8d\x91\0" /* offset 11990 */
+ "\xe5\x96\x9d\0" /* offset 11994 */
+ "\xe5\x98\x86\0" /* offset 11998 */
+ "\xe5\x99\xa8\0" /* offset 12002 */
+ "\xe5\xa1\x80\0" /* offset 12006 */
+ "\xe5\xa2\xa8\0" /* offset 12010 */
+ "\xe5\xb1\xa4\0" /* offset 12014 */
+ "\xe6\x82\x94\0" /* offset 12018 */
+ "\xe6\x85\xa8\0" /* offset 12022 */
+ "\xe6\x86\x8e\0" /* offset 12026 */
+ "\xe6\x87\xb2\0" /* offset 12030 */
+ "\xe6\x95\x8f\0" /* offset 12034 */
+ "\xe6\x97\xa2\0" /* offset 12038 */
+ "\xe6\x9a\x91\0" /* offset 12042 */
+ "\xe6\xa2\x85\0" /* offset 12046 */
+ "\xe6\xb5\xb7\0" /* offset 12050 */
+ "\xe6\xb8\x9a\0" /* offset 12054 */
+ "\xe6\xbc\xa2\0" /* offset 12058 */
+ "\xe7\x85\xae\0" /* offset 12062 */
+ "\xe7\x88\xab\0" /* offset 12066 */
+ "\xe7\x90\xa2\0" /* offset 12070 */
+ "\xe7\xa2\x91\0" /* offset 12074 */
+ "\xe7\xa5\x89\0" /* offset 12078 */
+ "\xe7\xa5\x88\0" /* offset 12082 */
+ "\xe7\xa5\x90\0" /* offset 12086 */
+ "\xe7\xa5\x96\0" /* offset 12090 */
+ "\xe7\xa6\x8d\0" /* offset 12094 */
+ "\xe7\xa6\x8e\0" /* offset 12098 */
+ "\xe7\xa9\x80\0" /* offset 12102 */
+ "\xe7\xaa\x81\0" /* offset 12106 */
+ "\xe7\xaf\x80\0" /* offset 12110 */
+ "\xe7\xb8\x89\0" /* offset 12114 */
+ "\xe7\xb9\x81\0" /* offset 12118 */
+ "\xe7\xbd\xb2\0" /* offset 12122 */
+ "\xe8\x80\x85\0" /* offset 12126 */
+ "\xe8\x87\xad\0" /* offset 12130 */
+ "\xe8\x89\xb9\0" /* offset 12134 */
+ "\xe8\x91\x97\0" /* offset 12138 */
+ "\xe8\xa4\x90\0" /* offset 12142 */
+ "\xe8\xa6\x96\0" /* offset 12146 */
+ "\xe8\xac\x81\0" /* offset 12150 */
+ "\xe8\xac\xb9\0" /* offset 12154 */
+ "\xe8\xb3\x93\0" /* offset 12158 */
+ "\xe8\xb4\x88\0" /* offset 12162 */
+ "\xe8\xbe\xb6\0" /* offset 12166 */
+ "\xe9\x9b\xa3\0" /* offset 12170 */
+ "\xe9\x9f\xbf\0" /* offset 12174 */
+ "\xe9\xa0\xbb\0" /* offset 12178 */
+ "\xe6\x81\xb5\0" /* offset 12182 */
+ "\xf0\xa4\x8b\xae\0" /* offset 12186 */
+ "\xe8\x88\x98\0" /* offset 12191 */
+ "\xe4\xb8\xa6\0" /* offset 12195 */
+ "\xe5\x86\xb5\0" /* offset 12199 */
+ "\xe5\x85\xa8\0" /* offset 12203 */
+ "\xe4\xbe\x80\0" /* offset 12207 */
+ "\xe5\x85\x85\0" /* offset 12211 */
+ "\xe5\x86\x80\0" /* offset 12215 */
+ "\xe5\x8b\x87\0" /* offset 12219 */
+ "\xe5\x8b\xba\0" /* offset 12223 */
+ "\xe5\x95\x95\0" /* offset 12227 */
+ "\xe5\x96\x99\0" /* offset 12231 */
+ "\xe5\x97\xa2\0" /* offset 12235 */
+ "\xe5\xa2\xb3\0" /* offset 12239 */
+ "\xe5\xa5\x84\0" /* offset 12243 */
+ "\xe5\xa5\x94\0" /* offset 12247 */
+ "\xe5\xa9\xa2\0" /* offset 12251 */
+ "\xe5\xac\xa8\0" /* offset 12255 */
+ "\xe5\xbb\x92\0" /* offset 12259 */
+ "\xe5\xbb\x99\0" /* offset 12263 */
+ "\xe5\xbd\xa9\0" /* offset 12267 */
+ "\xe5\xbe\xad\0" /* offset 12271 */
+ "\xe6\x83\x98\0" /* offset 12275 */
+ "\xe6\x85\x8e\0" /* offset 12279 */
+ "\xe6\x84\x88\0" /* offset 12283 */
+ "\xe6\x85\xa0\0" /* offset 12287 */
+ "\xe6\x88\xb4\0" /* offset 12291 */
+ "\xe6\x8f\x84\0" /* offset 12295 */
+ "\xe6\x90\x9c\0" /* offset 12299 */
+ "\xe6\x91\x92\0" /* offset 12303 */
+ "\xe6\x95\x96\0" /* offset 12307 */
+ "\xe6\x9c\x9b\0" /* offset 12311 */
+ "\xe6\x9d\x96\0" /* offset 12315 */
+ "\xe6\xbb\x9b\0" /* offset 12319 */
+ "\xe6\xbb\x8b\0" /* offset 12323 */
+ "\xe7\x80\x9e\0" /* offset 12327 */
+ "\xe7\x9e\xa7\0" /* offset 12331 */
+ "\xe7\x88\xb5\0" /* offset 12335 */
+ "\xe7\x8a\xaf\0" /* offset 12339 */
+ "\xe7\x91\xb1\0" /* offset 12343 */
+ "\xe7\x94\x86\0" /* offset 12347 */
+ "\xe7\x94\xbb\0" /* offset 12351 */
+ "\xe7\x98\x9d\0" /* offset 12355 */
+ "\xe7\x98\x9f\0" /* offset 12359 */
+ "\xe7\x9b\x9b\0" /* offset 12363 */
+ "\xe7\x9b\xb4\0" /* offset 12367 */
+ "\xe7\x9d\x8a\0" /* offset 12371 */
+ "\xe7\x9d\x80\0" /* offset 12375 */
+ "\xe7\xa3\x8c\0" /* offset 12379 */
+ "\xe7\xaa\xb1\0" /* offset 12383 */
+ "\xe7\xb1\xbb\0" /* offset 12387 */
+ "\xe7\xb5\x9b\0" /* offset 12391 */
+ "\xe7\xbc\xbe\0" /* offset 12395 */
+ "\xe8\x8d\x92\0" /* offset 12399 */
+ "\xe8\x8f\xaf\0" /* offset 12403 */
+ "\xe8\x9d\xb9\0" /* offset 12407 */
+ "\xe8\xa5\x81\0" /* offset 12411 */
+ "\xe8\xa6\x86\0" /* offset 12415 */
+ "\xe8\xaa\xbf\0" /* offset 12419 */
+ "\xe8\xab\x8b\0" /* offset 12423 */
+ "\xe8\xab\xad\0" /* offset 12427 */
+ "\xe8\xae\x8a\0" /* offset 12431 */
+ "\xe8\xbc\xb8\0" /* offset 12435 */
+ "\xe9\x81\xb2\0" /* offset 12439 */
+ "\xe9\x86\x99\0" /* offset 12443 */
+ "\xe9\x89\xb6\0" /* offset 12447 */
+ "\xe9\x99\xbc\0" /* offset 12451 */
+ "\xe9\x9f\x9b\0" /* offset 12455 */
+ "\xe9\xa0\x8b\0" /* offset 12459 */
+ "\xe9\xac\x92\0" /* offset 12463 */
+ "\xf0\xa2\xa1\x8a\0" /* offset 12467 */
+ "\xf0\xa2\xa1\x84\0" /* offset 12472 */
+ "\xf0\xa3\x8f\x95\0" /* offset 12477 */
+ "\xe3\xae\x9d\0" /* offset 12482 */
+ "\xe4\x80\x98\0" /* offset 12486 */
+ "\xe4\x80\xb9\0" /* offset 12490 */
+ "\xf0\xa5\x89\x89\0" /* offset 12494 */
+ "\xf0\xa5\xb3\x90\0" /* offset 12499 */
+ "\xf0\xa7\xbb\x93\0" /* offset 12504 */
+ "\xe9\xbd\x83\0" /* offset 12509 */
+ "\xe9\xbe\x8e\0" /* offset 12513 */
+ "\x66\x66\0" /* offset 12517 */
+ "\x66\x69\0" /* offset 12520 */
+ "\x66\x6c\0" /* offset 12523 */
+ "\x66\x66\x69\0" /* offset 12526 */
+ "\x66\x66\x6c\0" /* offset 12530 */
+ "\x73\x74\0" /* offset 12534 */
+ "\xd5\xb4\xd5\xb6\0" /* offset 12537 */
+ "\xd5\xb4\xd5\xa5\0" /* offset 12542 */
+ "\xd5\xb4\xd5\xab\0" /* offset 12547 */
+ "\xd5\xbe\xd5\xb6\0" /* offset 12552 */
+ "\xd5\xb4\xd5\xad\0" /* offset 12557 */
+ "\xd7\x99\xd6\xb4\0" /* offset 12562 */
+ "\xd7\xb2\xd6\xb7\0" /* offset 12567 */
+ "\xd7\xa2\0" /* offset 12572 */
+ "\xd7\x94\0" /* offset 12575 */
+ "\xd7\x9b\0" /* offset 12578 */
+ "\xd7\x9c\0" /* offset 12581 */
+ "\xd7\x9d\0" /* offset 12584 */
+ "\xd7\xa8\0" /* offset 12587 */
+ "\xd7\xaa\0" /* offset 12590 */
+ "\xd7\xa9\xd7\x81\0" /* offset 12593 */
+ "\xd7\xa9\xd7\x82\0" /* offset 12598 */
+ "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 12603 */
+ "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 12610 */
+ "\xd7\x90\xd6\xb7\0" /* offset 12617 */
+ "\xd7\x90\xd6\xb8\0" /* offset 12622 */
+ "\xd7\x90\xd6\xbc\0" /* offset 12627 */
+ "\xd7\x91\xd6\xbc\0" /* offset 12632 */
+ "\xd7\x92\xd6\xbc\0" /* offset 12637 */
+ "\xd7\x93\xd6\xbc\0" /* offset 12642 */
+ "\xd7\x94\xd6\xbc\0" /* offset 12647 */
+ "\xd7\x95\xd6\xbc\0" /* offset 12652 */
+ "\xd7\x96\xd6\xbc\0" /* offset 12657 */
+ "\xd7\x98\xd6\xbc\0" /* offset 12662 */
+ "\xd7\x99\xd6\xbc\0" /* offset 12667 */
+ "\xd7\x9a\xd6\xbc\0" /* offset 12672 */
+ "\xd7\x9b\xd6\xbc\0" /* offset 12677 */
+ "\xd7\x9c\xd6\xbc\0" /* offset 12682 */
+ "\xd7\x9e\xd6\xbc\0" /* offset 12687 */
+ "\xd7\xa0\xd6\xbc\0" /* offset 12692 */
+ "\xd7\xa1\xd6\xbc\0" /* offset 12697 */
+ "\xd7\xa3\xd6\xbc\0" /* offset 12702 */
+ "\xd7\xa4\xd6\xbc\0" /* offset 12707 */
+ "\xd7\xa6\xd6\xbc\0" /* offset 12712 */
+ "\xd7\xa7\xd6\xbc\0" /* offset 12717 */
+ "\xd7\xa8\xd6\xbc\0" /* offset 12722 */
+ "\xd7\xa9\xd6\xbc\0" /* offset 12727 */
+ "\xd7\xaa\xd6\xbc\0" /* offset 12732 */
+ "\xd7\x95\xd6\xb9\0" /* offset 12737 */
+ "\xd7\x91\xd6\xbf\0" /* offset 12742 */
+ "\xd7\x9b\xd6\xbf\0" /* offset 12747 */
+ "\xd7\xa4\xd6\xbf\0" /* offset 12752 */
+ "\xd7\x90\xd7\x9c\0" /* offset 12757 */
+ "\xd9\xb1\0" /* offset 12762 */
+ "\xd9\xbb\0" /* offset 12765 */
+ "\xd9\xbe\0" /* offset 12768 */
+ "\xda\x80\0" /* offset 12771 */
+ "\xd9\xba\0" /* offset 12774 */
+ "\xd9\xbf\0" /* offset 12777 */
+ "\xd9\xb9\0" /* offset 12780 */
+ "\xda\xa4\0" /* offset 12783 */
+ "\xda\xa6\0" /* offset 12786 */
+ "\xda\x84\0" /* offset 12789 */
+ "\xda\x83\0" /* offset 12792 */
+ "\xda\x86\0" /* offset 12795 */
+ "\xda\x87\0" /* offset 12798 */
+ "\xda\x8d\0" /* offset 12801 */
+ "\xda\x8c\0" /* offset 12804 */
+ "\xda\x8e\0" /* offset 12807 */
+ "\xda\x88\0" /* offset 12810 */
+ "\xda\x98\0" /* offset 12813 */
+ "\xda\x91\0" /* offset 12816 */
+ "\xda\xa9\0" /* offset 12819 */
+ "\xda\xaf\0" /* offset 12822 */
+ "\xda\xb3\0" /* offset 12825 */
+ "\xda\xb1\0" /* offset 12828 */
+ "\xda\xba\0" /* offset 12831 */
+ "\xda\xbb\0" /* offset 12834 */
+ "\xdb\x81\0" /* offset 12837 */
+ "\xda\xbe\0" /* offset 12840 */
+ "\xdb\x92\0" /* offset 12843 */
+ "\xda\xad\0" /* offset 12846 */
+ "\xdb\x87\0" /* offset 12849 */
+ "\xdb\x86\0" /* offset 12852 */
+ "\xdb\x88\0" /* offset 12855 */
+ "\xdb\x8b\0" /* offset 12858 */
+ "\xdb\x85\0" /* offset 12861 */
+ "\xdb\x89\0" /* offset 12864 */
+ "\xdb\x90\0" /* offset 12867 */
+ "\xd9\x89\0" /* offset 12870 */
+ "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12873 */
+ "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12880 */
+ "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12887 */
+ "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12894 */
+ "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12901 */
+ "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12908 */
+ "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12915 */
+ "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12922 */
+ "\xdb\x8c\0" /* offset 12929 */
+ "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12932 */
+ "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12939 */
+ "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12946 */
+ "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12953 */
+ "\xd8\xa8\xd8\xac\0" /* offset 12960 */
+ "\xd8\xa8\xd8\xad\0" /* offset 12965 */
+ "\xd8\xa8\xd8\xae\0" /* offset 12970 */
+ "\xd8\xa8\xd9\x85\0" /* offset 12975 */
+ "\xd8\xa8\xd9\x89\0" /* offset 12980 */
+ "\xd8\xa8\xd9\x8a\0" /* offset 12985 */
+ "\xd8\xaa\xd8\xac\0" /* offset 12990 */
+ "\xd8\xaa\xd8\xad\0" /* offset 12995 */
+ "\xd8\xaa\xd8\xae\0" /* offset 13000 */
+ "\xd8\xaa\xd9\x85\0" /* offset 13005 */
+ "\xd8\xaa\xd9\x89\0" /* offset 13010 */
+ "\xd8\xaa\xd9\x8a\0" /* offset 13015 */
+ "\xd8\xab\xd8\xac\0" /* offset 13020 */
+ "\xd8\xab\xd9\x85\0" /* offset 13025 */
+ "\xd8\xab\xd9\x89\0" /* offset 13030 */
+ "\xd8\xab\xd9\x8a\0" /* offset 13035 */
+ "\xd8\xac\xd8\xad\0" /* offset 13040 */
+ "\xd8\xac\xd9\x85\0" /* offset 13045 */
+ "\xd8\xad\xd8\xac\0" /* offset 13050 */
+ "\xd8\xad\xd9\x85\0" /* offset 13055 */
+ "\xd8\xae\xd8\xac\0" /* offset 13060 */
+ "\xd8\xae\xd8\xad\0" /* offset 13065 */
+ "\xd8\xae\xd9\x85\0" /* offset 13070 */
+ "\xd8\xb3\xd8\xac\0" /* offset 13075 */
+ "\xd8\xb3\xd8\xad\0" /* offset 13080 */
+ "\xd8\xb3\xd8\xae\0" /* offset 13085 */
+ "\xd8\xb3\xd9\x85\0" /* offset 13090 */
+ "\xd8\xb5\xd8\xad\0" /* offset 13095 */
+ "\xd8\xb5\xd9\x85\0" /* offset 13100 */
+ "\xd8\xb6\xd8\xac\0" /* offset 13105 */
+ "\xd8\xb6\xd8\xad\0" /* offset 13110 */
+ "\xd8\xb6\xd8\xae\0" /* offset 13115 */
+ "\xd8\xb6\xd9\x85\0" /* offset 13120 */
+ "\xd8\xb7\xd8\xad\0" /* offset 13125 */
+ "\xd8\xb7\xd9\x85\0" /* offset 13130 */
+ "\xd8\xb8\xd9\x85\0" /* offset 13135 */
+ "\xd8\xb9\xd8\xac\0" /* offset 13140 */
+ "\xd8\xb9\xd9\x85\0" /* offset 13145 */
+ "\xd8\xba\xd8\xac\0" /* offset 13150 */
+ "\xd8\xba\xd9\x85\0" /* offset 13155 */
+ "\xd9\x81\xd8\xac\0" /* offset 13160 */
+ "\xd9\x81\xd8\xad\0" /* offset 13165 */
+ "\xd9\x81\xd8\xae\0" /* offset 13170 */
+ "\xd9\x81\xd9\x85\0" /* offset 13175 */
+ "\xd9\x81\xd9\x89\0" /* offset 13180 */
+ "\xd9\x81\xd9\x8a\0" /* offset 13185 */
+ "\xd9\x82\xd8\xad\0" /* offset 13190 */
+ "\xd9\x82\xd9\x85\0" /* offset 13195 */
+ "\xd9\x82\xd9\x89\0" /* offset 13200 */
+ "\xd9\x82\xd9\x8a\0" /* offset 13205 */
+ "\xd9\x83\xd8\xa7\0" /* offset 13210 */
+ "\xd9\x83\xd8\xac\0" /* offset 13215 */
+ "\xd9\x83\xd8\xad\0" /* offset 13220 */
+ "\xd9\x83\xd8\xae\0" /* offset 13225 */
+ "\xd9\x83\xd9\x84\0" /* offset 13230 */
+ "\xd9\x83\xd9\x85\0" /* offset 13235 */
+ "\xd9\x83\xd9\x89\0" /* offset 13240 */
+ "\xd9\x83\xd9\x8a\0" /* offset 13245 */
+ "\xd9\x84\xd8\xac\0" /* offset 13250 */
+ "\xd9\x84\xd8\xad\0" /* offset 13255 */
+ "\xd9\x84\xd8\xae\0" /* offset 13260 */
+ "\xd9\x84\xd9\x85\0" /* offset 13265 */
+ "\xd9\x84\xd9\x89\0" /* offset 13270 */
+ "\xd9\x84\xd9\x8a\0" /* offset 13275 */
+ "\xd9\x85\xd8\xac\0" /* offset 13280 */
+ "\xd9\x85\xd8\xad\0" /* offset 13285 */
+ "\xd9\x85\xd8\xae\0" /* offset 13290 */
+ "\xd9\x85\xd9\x85\0" /* offset 13295 */
+ "\xd9\x85\xd9\x89\0" /* offset 13300 */
+ "\xd9\x85\xd9\x8a\0" /* offset 13305 */
+ "\xd9\x86\xd8\xac\0" /* offset 13310 */
+ "\xd9\x86\xd8\xad\0" /* offset 13315 */
+ "\xd9\x86\xd8\xae\0" /* offset 13320 */
+ "\xd9\x86\xd9\x85\0" /* offset 13325 */
+ "\xd9\x86\xd9\x89\0" /* offset 13330 */
+ "\xd9\x86\xd9\x8a\0" /* offset 13335 */
+ "\xd9\x87\xd8\xac\0" /* offset 13340 */
+ "\xd9\x87\xd9\x85\0" /* offset 13345 */
+ "\xd9\x87\xd9\x89\0" /* offset 13350 */
+ "\xd9\x87\xd9\x8a\0" /* offset 13355 */
+ "\xd9\x8a\xd8\xac\0" /* offset 13360 */
+ "\xd9\x8a\xd8\xad\0" /* offset 13365 */
+ "\xd9\x8a\xd8\xae\0" /* offset 13370 */
+ "\xd9\x8a\xd9\x85\0" /* offset 13375 */
+ "\xd9\x8a\xd9\x89\0" /* offset 13380 */
+ "\xd9\x8a\xd9\x8a\0" /* offset 13385 */
+ "\xd8\xb0\xd9\xb0\0" /* offset 13390 */
+ "\xd8\xb1\xd9\xb0\0" /* offset 13395 */
+ "\xd9\x89\xd9\xb0\0" /* offset 13400 */
+ "\x20\xd9\x8c\xd9\x91\0" /* offset 13405 */
+ "\x20\xd9\x8d\xd9\x91\0" /* offset 13411 */
+ "\x20\xd9\x8e\xd9\x91\0" /* offset 13417 */
+ "\x20\xd9\x8f\xd9\x91\0" /* offset 13423 */
+ "\x20\xd9\x90\xd9\x91\0" /* offset 13429 */
+ "\x20\xd9\x91\xd9\xb0\0" /* offset 13435 */
+ "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 13441 */
+ "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 13448 */
+ "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 13455 */
+ "\xd8\xa8\xd8\xb1\0" /* offset 13462 */
+ "\xd8\xa8\xd8\xb2\0" /* offset 13467 */
+ "\xd8\xa8\xd9\x86\0" /* offset 13472 */
+ "\xd8\xaa\xd8\xb1\0" /* offset 13477 */
+ "\xd8\xaa\xd8\xb2\0" /* offset 13482 */
+ "\xd8\xaa\xd9\x86\0" /* offset 13487 */
+ "\xd8\xab\xd8\xb1\0" /* offset 13492 */
+ "\xd8\xab\xd8\xb2\0" /* offset 13497 */
+ "\xd8\xab\xd9\x86\0" /* offset 13502 */
+ "\xd9\x85\xd8\xa7\0" /* offset 13507 */
+ "\xd9\x86\xd8\xb1\0" /* offset 13512 */
+ "\xd9\x86\xd8\xb2\0" /* offset 13517 */
+ "\xd9\x86\xd9\x86\0" /* offset 13522 */
+ "\xd9\x8a\xd8\xb1\0" /* offset 13527 */
+ "\xd9\x8a\xd8\xb2\0" /* offset 13532 */
+ "\xd9\x8a\xd9\x86\0" /* offset 13537 */
+ "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 13542 */
+ "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 13549 */
+ "\xd8\xa8\xd9\x87\0" /* offset 13556 */
+ "\xd8\xaa\xd9\x87\0" /* offset 13561 */
+ "\xd8\xb5\xd8\xae\0" /* offset 13566 */
+ "\xd9\x84\xd9\x87\0" /* offset 13571 */
+ "\xd9\x86\xd9\x87\0" /* offset 13576 */
+ "\xd9\x87\xd9\xb0\0" /* offset 13581 */
+ "\xd9\x8a\xd9\x87\0" /* offset 13586 */
+ "\xd8\xab\xd9\x87\0" /* offset 13591 */
+ "\xd8\xb3\xd9\x87\0" /* offset 13596 */
+ "\xd8\xb4\xd9\x85\0" /* offset 13601 */
+ "\xd8\xb4\xd9\x87\0" /* offset 13606 */
+ "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 13611 */
+ "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 13618 */
+ "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 13625 */
+ "\xd8\xb7\xd9\x89\0" /* offset 13632 */
+ "\xd8\xb7\xd9\x8a\0" /* offset 13637 */
+ "\xd8\xb9\xd9\x89\0" /* offset 13642 */
+ "\xd8\xb9\xd9\x8a\0" /* offset 13647 */
+ "\xd8\xba\xd9\x89\0" /* offset 13652 */
+ "\xd8\xba\xd9\x8a\0" /* offset 13657 */
+ "\xd8\xb3\xd9\x89\0" /* offset 13662 */
+ "\xd8\xb3\xd9\x8a\0" /* offset 13667 */
+ "\xd8\xb4\xd9\x89\0" /* offset 13672 */
+ "\xd8\xb4\xd9\x8a\0" /* offset 13677 */
+ "\xd8\xad\xd9\x89\0" /* offset 13682 */
+ "\xd8\xad\xd9\x8a\0" /* offset 13687 */
+ "\xd8\xac\xd9\x89\0" /* offset 13692 */
+ "\xd8\xac\xd9\x8a\0" /* offset 13697 */
+ "\xd8\xae\xd9\x89\0" /* offset 13702 */
+ "\xd8\xae\xd9\x8a\0" /* offset 13707 */
+ "\xd8\xb5\xd9\x89\0" /* offset 13712 */
+ "\xd8\xb5\xd9\x8a\0" /* offset 13717 */
+ "\xd8\xb6\xd9\x89\0" /* offset 13722 */
+ "\xd8\xb6\xd9\x8a\0" /* offset 13727 */
+ "\xd8\xb4\xd8\xac\0" /* offset 13732 */
+ "\xd8\xb4\xd8\xad\0" /* offset 13737 */
+ "\xd8\xb4\xd8\xae\0" /* offset 13742 */
+ "\xd8\xb4\xd8\xb1\0" /* offset 13747 */
+ "\xd8\xb3\xd8\xb1\0" /* offset 13752 */
+ "\xd8\xb5\xd8\xb1\0" /* offset 13757 */
+ "\xd8\xb6\xd8\xb1\0" /* offset 13762 */
+ "\xd8\xa7\xd9\x8b\0" /* offset 13767 */
+ "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13772 */
+ "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13779 */
+ "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13786 */
+ "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13793 */
+ "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13800 */
+ "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13807 */
+ "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13814 */
+ "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13821 */
+ "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13828 */
+ "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13835 */
+ "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13842 */
+ "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13849 */
+ "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13856 */
+ "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13863 */
+ "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13870 */
+ "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13877 */
+ "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13884 */
+ "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13891 */
+ "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13898 */
+ "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13905 */
+ "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13912 */
+ "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13919 */
+ "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13926 */
+ "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13933 */
+ "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13940 */
+ "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13947 */
+ "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13954 */
+ "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13961 */
+ "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13968 */
+ "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13975 */
+ "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13982 */
+ "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13989 */
+ "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13996 */
+ "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 14003 */
+ "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 14010 */
+ "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 14017 */
+ "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 14024 */
+ "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 14031 */
+ "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 14038 */
+ "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 14045 */
+ "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 14052 */
+ "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 14059 */
+ "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 14066 */
+ "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 14073 */
+ "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 14080 */
+ "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 14087 */
+ "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 14094 */
+ "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 14101 */
+ "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 14108 */
+ "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 14115 */
+ "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 14122 */
+ "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 14129 */
+ "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 14136 */
+ "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 14143 */
+ "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 14150 */
+ "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 14157 */
+ "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 14164 */
+ "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 14171 */
+ "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 14178 */
+ "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 14185 */
+ "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 14192 */
+ "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 14199 */
+ "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 14206 */
+ "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 14213 */
+ "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 14220 */
+ "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 14227 */
+ "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 14234 */
+ "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 14241 */
+ "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 14248 */
+ "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 14255 */
+ "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 14262 */
+ "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 14269 */
+ "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 14276 */
+ "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 14283 */
+ "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 14290 */
+ "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 14297 */
+ "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 14304 */
+ "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 14311 */
+ "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 14318 */
+ "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 14325 */
+ "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 14332 */
+ "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 14339 */
+ "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 14346 */
+ "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 14353 */
+ "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 14360 */
+ "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 14367 */
+ "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 14374 */
+ "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 14381 */
+ "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 14388 */
+ "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 14395 */
+ "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 14402 */
+ "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 14409 */
+ "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 14416 */
+ "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 14423 */
+ "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 14430 */
+ "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 14437 */
+ "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 14444 */
+ "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 14453 */
+ "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 14462 */
+ "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 14471 */
+ "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 14480 */
+ "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 14489 */
+ "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14498 */
+ "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 14507 */
+ "\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 14514 */
+ "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 14548 */
+ "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 14564 */
+ "\x2c\0" /* offset 14573 */
+ "\xe3\x80\x81\0" /* offset 14575 */
+ "\xe3\x80\x82\0" /* offset 14579 */
+ "\x3a\0" /* offset 14583 */
+ "\x21\0" /* offset 14585 */
+ "\x3f\0" /* offset 14587 */
+ "\xe3\x80\x96\0" /* offset 14589 */
+ "\xe3\x80\x97\0" /* offset 14593 */
+ "\xe2\x80\x94\0" /* offset 14597 */
+ "\xe2\x80\x93\0" /* offset 14601 */
+ "\x5f\0" /* offset 14605 */
+ "\x7b\0" /* offset 14607 */
+ "\x7d\0" /* offset 14609 */
+ "\xe3\x80\x94\0" /* offset 14611 */
+ "\xe3\x80\x95\0" /* offset 14615 */
+ "\xe3\x80\x90\0" /* offset 14619 */
+ "\xe3\x80\x91\0" /* offset 14623 */
+ "\xe3\x80\x8a\0" /* offset 14627 */
+ "\xe3\x80\x8b\0" /* offset 14631 */
+ "\xe3\x80\x8c\0" /* offset 14635 */
+ "\xe3\x80\x8d\0" /* offset 14639 */
+ "\xe3\x80\x8e\0" /* offset 14643 */
+ "\xe3\x80\x8f\0" /* offset 14647 */
+ "\x5b\0" /* offset 14651 */
+ "\x5d\0" /* offset 14653 */
+ "\x23\0" /* offset 14655 */
+ "\x26\0" /* offset 14657 */
+ "\x2a\0" /* offset 14659 */
+ "\x2d\0" /* offset 14661 */
+ "\x3c\0" /* offset 14663 */
+ "\x3e\0" /* offset 14665 */
+ "\x5c\0" /* offset 14667 */
+ "\x24\0" /* offset 14669 */
+ "\x25\0" /* offset 14671 */
+ "\x40\0" /* offset 14673 */
+ "\x20\xd9\x8b\0" /* offset 14675 */
+ "\xd9\x80\xd9\x8b\0" /* offset 14679 */
+ "\x20\xd9\x8c\0" /* offset 14684 */
+ "\x20\xd9\x8d\0" /* offset 14688 */
+ "\x20\xd9\x8e\0" /* offset 14692 */
+ "\xd9\x80\xd9\x8e\0" /* offset 14696 */
+ "\x20\xd9\x8f\0" /* offset 14701 */
+ "\xd9\x80\xd9\x8f\0" /* offset 14705 */
+ "\x20\xd9\x90\0" /* offset 14710 */
+ "\xd9\x80\xd9\x90\0" /* offset 14714 */
+ "\x20\xd9\x91\0" /* offset 14719 */
+ "\xd9\x80\xd9\x91\0" /* offset 14723 */
+ "\x20\xd9\x92\0" /* offset 14728 */
+ "\xd9\x80\xd9\x92\0" /* offset 14732 */
+ "\xd8\xa1\0" /* offset 14737 */
+ "\xd8\xa7\0" /* offset 14740 */
+ "\xd8\xa8\0" /* offset 14743 */
+ "\xd8\xa9\0" /* offset 14746 */
+ "\xd8\xaa\0" /* offset 14749 */
+ "\xd8\xab\0" /* offset 14752 */
+ "\xd8\xac\0" /* offset 14755 */
+ "\xd8\xad\0" /* offset 14758 */
+ "\xd8\xae\0" /* offset 14761 */
+ "\xd8\xaf\0" /* offset 14764 */
+ "\xd8\xb0\0" /* offset 14767 */
+ "\xd8\xb1\0" /* offset 14770 */
+ "\xd8\xb2\0" /* offset 14773 */
+ "\xd8\xb3\0" /* offset 14776 */
+ "\xd8\xb4\0" /* offset 14779 */
+ "\xd8\xb5\0" /* offset 14782 */
+ "\xd8\xb6\0" /* offset 14785 */
+ "\xd8\xb7\0" /* offset 14788 */
+ "\xd8\xb8\0" /* offset 14791 */
+ "\xd8\xb9\0" /* offset 14794 */
+ "\xd8\xba\0" /* offset 14797 */
+ "\xd9\x81\0" /* offset 14800 */
+ "\xd9\x82\0" /* offset 14803 */
+ "\xd9\x83\0" /* offset 14806 */
+ "\xd9\x84\0" /* offset 14809 */
+ "\xd9\x85\0" /* offset 14812 */
+ "\xd9\x86\0" /* offset 14815 */
+ "\xd9\x87\0" /* offset 14818 */
+ "\xd9\x88\0" /* offset 14821 */
+ "\xd9\x8a\0" /* offset 14824 */
+ "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14827 */
+ "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14834 */
+ "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14841 */
+ "\xd9\x84\xd8\xa7\0" /* offset 14848 */
+ "\x22\0" /* offset 14853 */
+ "\x27\0" /* offset 14855 */
+ "\x2f\0" /* offset 14857 */
+ "\x5e\0" /* offset 14859 */
+ "\x7c\0" /* offset 14861 */
+ "\x7e\0" /* offset 14863 */
+ "\xe2\xa6\x85\0" /* offset 14865 */
+ "\xe2\xa6\x86\0" /* offset 14869 */
+ "\xe3\x83\xbb\0" /* offset 14873 */
+ "\xe3\x82\xa1\0" /* offset 14877 */
+ "\xe3\x82\xa3\0" /* offset 14881 */
+ "\xe3\x82\xa5\0" /* offset 14885 */
+ "\xe3\x82\xa7\0" /* offset 14889 */
+ "\xe3\x82\xa9\0" /* offset 14893 */
+ "\xe3\x83\xa3\0" /* offset 14897 */
+ "\xe3\x83\xa5\0" /* offset 14901 */
+ "\xe3\x83\xa7\0" /* offset 14905 */
+ "\xe3\x83\x83\0" /* offset 14909 */
+ "\xe3\x83\xbc\0" /* offset 14913 */
+ "\xe3\x83\xb3\0" /* offset 14917 */
+ "\xe3\x82\x99\0" /* offset 14921 */
+ "\xe3\x82\x9a\0" /* offset 14925 */
+ "\xc2\xa2\0" /* offset 14929 */
+ "\xc2\xa3\0" /* offset 14932 */
+ "\xc2\xac\0" /* offset 14935 */
+ "\xc2\xa6\0" /* offset 14938 */
+ "\xc2\xa5\0" /* offset 14941 */
+ "\xe2\x82\xa9\0" /* offset 14944 */
+ "\xe2\x94\x82\0" /* offset 14948 */
+ "\xe2\x86\x90\0" /* offset 14952 */
+ "\xe2\x86\x91\0" /* offset 14956 */
+ "\xe2\x86\x92\0" /* offset 14960 */
+ "\xe2\x86\x93\0" /* offset 14964 */
+ "\xe2\x96\xa0\0" /* offset 14968 */
+ "\xe2\x97\x8b\0" /* offset 14972 */
+ "\xf0\x91\x82\x99\xf0\x91\x82\xba\0" /* offset 14976 */
+ "\xf0\x91\x82\x9b\xf0\x91\x82\xba\0" /* offset 14985 */
+ "\xf0\x91\x82\xa5\xf0\x91\x82\xba\0" /* offset 14994 */
+ "\xf0\x91\x84\xb1\xf0\x91\x84\xa7\0" /* offset 15003 */
+ "\xf0\x91\x84\xb2\xf0\x91\x84\xa7\0" /* offset 15012 */
+ "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 15021 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 15030 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15039 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15052 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 15065 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 15078 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 15091 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 15104 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 15113 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15122 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15135 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15148 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15161 */
+ "\xc4\xb1\0" /* offset 15174 */
+ "\xc8\xb7\0" /* offset 15177 */
+ "\xce\x91\0" /* offset 15180 */
+ "\xce\x92\0" /* offset 15183 */
+ "\xce\x94\0" /* offset 15186 */
+ "\xce\x95\0" /* offset 15189 */
+ "\xce\x96\0" /* offset 15192 */
+ "\xce\x97\0" /* offset 15195 */
+ "\xce\x99\0" /* offset 15198 */
+ "\xce\x9a\0" /* offset 15201 */
+ "\xce\x9b\0" /* offset 15204 */
+ "\xce\x9c\0" /* offset 15207 */
+ "\xce\x9d\0" /* offset 15210 */
+ "\xce\x9e\0" /* offset 15213 */
+ "\xce\x9f\0" /* offset 15216 */
+ "\xce\xa1\0" /* offset 15219 */
+ "\xce\xa4\0" /* offset 15222 */
+ "\xce\xa6\0" /* offset 15225 */
+ "\xce\xa7\0" /* offset 15228 */
+ "\xce\xa8\0" /* offset 15231 */
+ "\xe2\x88\x87\0" /* offset 15234 */
+ "\xce\xb1\0" /* offset 15238 */
+ "\xce\xb6\0" /* offset 15241 */
+ "\xce\xb7\0" /* offset 15244 */
+ "\xce\xbb\0" /* offset 15247 */
+ "\xce\xbd\0" /* offset 15250 */
+ "\xce\xbe\0" /* offset 15253 */
+ "\xce\xbf\0" /* offset 15256 */
+ "\xcf\x83\0" /* offset 15259 */
+ "\xcf\x84\0" /* offset 15262 */
+ "\xcf\x85\0" /* offset 15265 */
+ "\xcf\x88\0" /* offset 15268 */
+ "\xcf\x89\0" /* offset 15271 */
+ "\xe2\x88\x82\0" /* offset 15274 */
+ "\xcf\x9c\0" /* offset 15278 */
+ "\xcf\x9d\0" /* offset 15281 */
+ "\xd9\xae\0" /* offset 15284 */
+ "\xda\xa1\0" /* offset 15287 */
+ "\xd9\xaf\0" /* offset 15290 */
+ "\x30\x2e\0" /* offset 15293 */
+ "\x30\x2c\0" /* offset 15296 */
+ "\x31\x2c\0" /* offset 15299 */
+ "\x32\x2c\0" /* offset 15302 */
+ "\x33\x2c\0" /* offset 15305 */
+ "\x34\x2c\0" /* offset 15308 */
+ "\x35\x2c\0" /* offset 15311 */
+ "\x36\x2c\0" /* offset 15314 */
+ "\x37\x2c\0" /* offset 15317 */
+ "\x38\x2c\0" /* offset 15320 */
+ "\x39\x2c\0" /* offset 15323 */
+ "\x28\x41\x29\0" /* offset 15326 */
+ "\x28\x42\x29\0" /* offset 15330 */
+ "\x28\x43\x29\0" /* offset 15334 */
+ "\x28\x44\x29\0" /* offset 15338 */
+ "\x28\x45\x29\0" /* offset 15342 */
+ "\x28\x46\x29\0" /* offset 15346 */
+ "\x28\x47\x29\0" /* offset 15350 */
+ "\x28\x48\x29\0" /* offset 15354 */
+ "\x28\x49\x29\0" /* offset 15358 */
+ "\x28\x4a\x29\0" /* offset 15362 */
+ "\x28\x4b\x29\0" /* offset 15366 */
+ "\x28\x4c\x29\0" /* offset 15370 */
+ "\x28\x4d\x29\0" /* offset 15374 */
+ "\x28\x4e\x29\0" /* offset 15378 */
+ "\x28\x4f\x29\0" /* offset 15382 */
+ "\x28\x50\x29\0" /* offset 15386 */
+ "\x28\x51\x29\0" /* offset 15390 */
+ "\x28\x52\x29\0" /* offset 15394 */
+ "\x28\x53\x29\0" /* offset 15398 */
+ "\x28\x54\x29\0" /* offset 15402 */
+ "\x28\x55\x29\0" /* offset 15406 */
+ "\x28\x56\x29\0" /* offset 15410 */
+ "\x28\x57\x29\0" /* offset 15414 */
+ "\x28\x58\x29\0" /* offset 15418 */
+ "\x28\x59\x29\0" /* offset 15422 */
+ "\x28\x5a\x29\0" /* offset 15426 */
+ "\xe3\x80\x94\x53\xe3\x80\x95\0" /* offset 15430 */
+ "\x43\x44\0" /* offset 15438 */
+ "\x57\x5a\0" /* offset 15441 */
+ "\x48\x56\0" /* offset 15444 */
+ "\x53\x44\0" /* offset 15447 */
+ "\x53\x53\0" /* offset 15450 */
+ "\x50\x50\x56\0" /* offset 15453 */
+ "\x57\x43\0" /* offset 15457 */
+ "\x4d\x43\0" /* offset 15460 */
+ "\x4d\x44\0" /* offset 15463 */
+ "\x44\x4a\0" /* offset 15466 */
+ "\xe3\x81\xbb\xe3\x81\x8b\0" /* offset 15469 */
+ "\xe3\x82\xb3\xe3\x82\xb3\0" /* offset 15476 */
+ "\xe5\xad\x97\0" /* offset 15483 */
+ "\xe5\x8f\x8c\0" /* offset 15487 */
+ "\xe5\xa4\x9a\0" /* offset 15491 */
+ "\xe8\xa7\xa3\0" /* offset 15495 */
+ "\xe4\xba\xa4\0" /* offset 15499 */
+ "\xe6\x98\xa0\0" /* offset 15503 */
+ "\xe7\x84\xa1\0" /* offset 15507 */
+ "\xe5\x89\x8d\0" /* offset 15511 */
+ "\xe5\xbe\x8c\0" /* offset 15515 */
+ "\xe5\x86\x8d\0" /* offset 15519 */
+ "\xe6\x96\xb0\0" /* offset 15523 */
+ "\xe5\x88\x9d\0" /* offset 15527 */
+ "\xe7\xb5\x82\0" /* offset 15531 */
+ "\xe8\xb2\xa9\0" /* offset 15535 */
+ "\xe5\xa3\xb0\0" /* offset 15539 */
+ "\xe5\x90\xb9\0" /* offset 15543 */
+ "\xe6\xbc\x94\0" /* offset 15547 */
+ "\xe6\x8a\x95\0" /* offset 15551 */
+ "\xe6\x8d\x95\0" /* offset 15555 */
+ "\xe9\x81\x8a\0" /* offset 15559 */
+ "\xe6\x8c\x87\0" /* offset 15563 */
+ "\xe6\x89\x93\0" /* offset 15567 */
+ "\xe7\xa6\x81\0" /* offset 15571 */
+ "\xe7\xa9\xba\0" /* offset 15575 */
+ "\xe5\x90\x88\0" /* offset 15579 */
+ "\xe6\xba\x80\0" /* offset 15583 */
+ "\xe7\x94\xb3\0" /* offset 15587 */
+ "\xe5\x89\xb2\0" /* offset 15591 */
+ "\xe5\x96\xb6\0" /* offset 15595 */
+ "\xe3\x80\x94\xe6\x9c\xac\xe3\x80\x95\0" /* offset 15599 */
+ "\xe3\x80\x94\xe4\xb8\x89\xe3\x80\x95\0" /* offset 15609 */
+ "\xe3\x80\x94\xe4\xba\x8c\xe3\x80\x95\0" /* offset 15619 */
+ "\xe3\x80\x94\xe5\xae\x89\xe3\x80\x95\0" /* offset 15629 */
+ "\xe3\x80\x94\xe7\x82\xb9\xe3\x80\x95\0" /* offset 15639 */
+ "\xe3\x80\x94\xe6\x89\x93\xe3\x80\x95\0" /* offset 15649 */
+ "\xe3\x80\x94\xe7\x9b\x97\xe3\x80\x95\0" /* offset 15659 */
+ "\xe3\x80\x94\xe5\x8b\x9d\xe3\x80\x95\0" /* offset 15669 */
+ "\xe3\x80\x94\xe6\x95\x97\xe3\x80\x95\0" /* offset 15679 */
+ "\xe5\xbe\x97\0" /* offset 15689 */
+ "\xe5\x8f\xaf\0" /* offset 15693 */
+ "\xe4\xb8\xbd\0" /* offset 15697 */
+ "\xe4\xb8\xb8\0" /* offset 15701 */
+ "\xe4\xb9\x81\0" /* offset 15705 */
+ "\xf0\xa0\x84\xa2\0" /* offset 15709 */
+ "\xe4\xbd\xa0\0" /* offset 15714 */
+ "\xe4\xbe\xbb\0" /* offset 15718 */
+ "\xe5\x80\x82\0" /* offset 15722 */
+ "\xe5\x81\xba\0" /* offset 15726 */
+ "\xe5\x82\x99\0" /* offset 15730 */
+ "\xe5\x83\x8f\0" /* offset 15734 */
+ "\xe3\x92\x9e\0" /* offset 15738 */
+ "\xf0\xa0\x98\xba\0" /* offset 15742 */
+ "\xe5\x85\x94\0" /* offset 15747 */
+ "\xe5\x85\xa4\0" /* offset 15751 */
+ "\xe5\x85\xb7\0" /* offset 15755 */
+ "\xf0\xa0\x94\x9c\0" /* offset 15759 */
+ "\xe3\x92\xb9\0" /* offset 15764 */
+ "\xe5\x85\xa7\0" /* offset 15768 */
+ "\xf0\xa0\x95\x8b\0" /* offset 15772 */
+ "\xe5\x86\x97\0" /* offset 15777 */
+ "\xe5\x86\xa4\0" /* offset 15781 */
+ "\xe4\xbb\x8c\0" /* offset 15785 */
+ "\xe5\x86\xac\0" /* offset 15789 */
+ "\xf0\xa9\x87\x9f\0" /* offset 15793 */
+ "\xe5\x88\x83\0" /* offset 15798 */
+ "\xe3\x93\x9f\0" /* offset 15802 */
+ "\xe5\x88\xbb\0" /* offset 15806 */
+ "\xe5\x89\x86\0" /* offset 15810 */
+ "\xe5\x89\xb7\0" /* offset 15814 */
+ "\xe3\x94\x95\0" /* offset 15818 */
+ "\xe5\x8c\x85\0" /* offset 15822 */
+ "\xe5\x8c\x86\0" /* offset 15826 */
+ "\xe5\x8d\x89\0" /* offset 15830 */
+ "\xe5\x8d\x9a\0" /* offset 15834 */
+ "\xe5\x8d\xb3\0" /* offset 15838 */
+ "\xe5\x8d\xbd\0" /* offset 15842 */
+ "\xe5\x8d\xbf\0" /* offset 15846 */
+ "\xf0\xa0\xa8\xac\0" /* offset 15850 */
+ "\xe7\x81\xb0\0" /* offset 15855 */
+ "\xe5\x8f\x8a\0" /* offset 15859 */
+ "\xe5\x8f\x9f\0" /* offset 15863 */
+ "\xf0\xa0\xad\xa3\0" /* offset 15867 */
+ "\xe5\x8f\xab\0" /* offset 15872 */
+ "\xe5\x8f\xb1\0" /* offset 15876 */
+ "\xe5\x90\x86\0" /* offset 15880 */
+ "\xe5\x92\x9e\0" /* offset 15884 */
+ "\xe5\x90\xb8\0" /* offset 15888 */
+ "\xe5\x91\x88\0" /* offset 15892 */
+ "\xe5\x91\xa8\0" /* offset 15896 */
+ "\xe5\x92\xa2\0" /* offset 15900 */
+ "\xe5\x93\xb6\0" /* offset 15904 */
+ "\xe5\x94\x90\0" /* offset 15908 */
+ "\xe5\x95\x93\0" /* offset 15912 */
+ "\xe5\x95\xa3\0" /* offset 15916 */
+ "\xe5\x96\x84\0" /* offset 15920 */
+ "\xe5\x96\xab\0" /* offset 15924 */
+ "\xe5\x96\xb3\0" /* offset 15928 */
+ "\xe5\x97\x82\0" /* offset 15932 */
+ "\xe5\x9c\x96\0" /* offset 15936 */
+ "\xe5\x9c\x97\0" /* offset 15940 */
+ "\xe5\x99\x91\0" /* offset 15944 */
+ "\xe5\x99\xb4\0" /* offset 15948 */
+ "\xe5\xa3\xae\0" /* offset 15952 */
+ "\xe5\x9f\x8e\0" /* offset 15956 */
+ "\xe5\x9f\xb4\0" /* offset 15960 */
+ "\xe5\xa0\x8d\0" /* offset 15964 */
+ "\xe5\x9e\x8b\0" /* offset 15968 */
+ "\xe5\xa0\xb2\0" /* offset 15972 */
+ "\xe5\xa0\xb1\0" /* offset 15976 */
+ "\xe5\xa2\xac\0" /* offset 15980 */
+ "\xf0\xa1\x93\xa4\0" /* offset 15984 */
+ "\xe5\xa3\xb2\0" /* offset 15989 */
+ "\xe5\xa3\xb7\0" /* offset 15993 */
+ "\xe5\xa4\x86\0" /* offset 15997 */
+ "\xe5\xa4\xa2\0" /* offset 16001 */
+ "\xe5\xa5\xa2\0" /* offset 16005 */
+ "\xf0\xa1\x9a\xa8\0" /* offset 16009 */
+ "\xf0\xa1\x9b\xaa\0" /* offset 16014 */
+ "\xe5\xa7\xac\0" /* offset 16019 */
+ "\xe5\xa8\x9b\0" /* offset 16023 */
+ "\xe5\xa8\xa7\0" /* offset 16027 */
+ "\xe5\xa7\x98\0" /* offset 16031 */
+ "\xe5\xa9\xa6\0" /* offset 16035 */
+ "\xe3\x9b\xae\0" /* offset 16039 */
+ "\xe3\x9b\xbc\0" /* offset 16043 */
+ "\xe5\xac\x88\0" /* offset 16047 */
+ "\xe5\xac\xbe\0" /* offset 16051 */
+ "\xf0\xa1\xa7\x88\0" /* offset 16055 */
+ "\xe5\xaf\x83\0" /* offset 16060 */
+ "\xe5\xaf\x98\0" /* offset 16064 */
+ "\xe5\xaf\xb3\0" /* offset 16068 */
+ "\xf0\xa1\xac\x98\0" /* offset 16072 */
+ "\xe5\xaf\xbf\0" /* offset 16077 */
+ "\xe5\xb0\x86\0" /* offset 16081 */
+ "\xe5\xbd\x93\0" /* offset 16085 */
+ "\xe3\x9e\x81\0" /* offset 16089 */
+ "\xe5\xb1\xa0\0" /* offset 16093 */
+ "\xe5\xb3\x80\0" /* offset 16097 */
+ "\xe5\xb2\x8d\0" /* offset 16101 */
+ "\xf0\xa1\xb7\xa4\0" /* offset 16105 */
+ "\xe5\xb5\x83\0" /* offset 16110 */
+ "\xf0\xa1\xb7\xa6\0" /* offset 16114 */
+ "\xe5\xb5\xae\0" /* offset 16119 */
+ "\xe5\xb5\xab\0" /* offset 16123 */
+ "\xe5\xb5\xbc\0" /* offset 16127 */
+ "\xe5\xb7\xa1\0" /* offset 16131 */
+ "\xe5\xb7\xa2\0" /* offset 16135 */
+ "\xe3\xa0\xaf\0" /* offset 16139 */
+ "\xe5\xb7\xbd\0" /* offset 16143 */
+ "\xe5\xb8\xa8\0" /* offset 16147 */
+ "\xe5\xb8\xbd\0" /* offset 16151 */
+ "\xe5\xb9\xa9\0" /* offset 16155 */
+ "\xe3\xa1\xa2\0" /* offset 16159 */
+ "\xf0\xa2\x86\x83\0" /* offset 16163 */
+ "\xe3\xa1\xbc\0" /* offset 16168 */
+ "\xe5\xba\xb0\0" /* offset 16172 */
+ "\xe5\xba\xb3\0" /* offset 16176 */
+ "\xe5\xba\xb6\0" /* offset 16180 */
+ "\xf0\xaa\x8e\x92\0" /* offset 16184 */
+ "\xf0\xa2\x8c\xb1\0" /* offset 16189 */
+ "\xe8\x88\x81\0" /* offset 16194 */
+ "\xe5\xbc\xa2\0" /* offset 16198 */
+ "\xe3\xa3\x87\0" /* offset 16202 */
+ "\xf0\xa3\x8a\xb8\0" /* offset 16206 */
+ "\xf0\xa6\x87\x9a\0" /* offset 16211 */
+ "\xe5\xbd\xa2\0" /* offset 16216 */
+ "\xe5\xbd\xab\0" /* offset 16220 */
+ "\xe3\xa3\xa3\0" /* offset 16224 */
+ "\xe5\xbe\x9a\0" /* offset 16228 */
+ "\xe5\xbf\x8d\0" /* offset 16232 */
+ "\xe5\xbf\x97\0" /* offset 16236 */
+ "\xe5\xbf\xb9\0" /* offset 16240 */
+ "\xe6\x82\x81\0" /* offset 16244 */
+ "\xe3\xa4\xba\0" /* offset 16248 */
+ "\xe3\xa4\x9c\0" /* offset 16252 */
+ "\xf0\xa2\x9b\x94\0" /* offset 16256 */
+ "\xe6\x83\x87\0" /* offset 16261 */
+ "\xe6\x85\x88\0" /* offset 16265 */
+ "\xe6\x85\x8c\0" /* offset 16269 */
+ "\xe6\x85\xba\0" /* offset 16273 */
+ "\xe6\x86\xb2\0" /* offset 16277 */
+ "\xe6\x86\xa4\0" /* offset 16281 */
+ "\xe6\x86\xaf\0" /* offset 16285 */
+ "\xe6\x87\x9e\0" /* offset 16289 */
+ "\xe6\x88\x90\0" /* offset 16293 */
+ "\xe6\x88\x9b\0" /* offset 16297 */
+ "\xe6\x89\x9d\0" /* offset 16301 */
+ "\xe6\x8a\xb1\0" /* offset 16305 */
+ "\xe6\x8b\x94\0" /* offset 16309 */
+ "\xe6\x8d\x90\0" /* offset 16313 */
+ "\xf0\xa2\xac\x8c\0" /* offset 16317 */
+ "\xe6\x8c\xbd\0" /* offset 16322 */
+ "\xe6\x8b\xbc\0" /* offset 16326 */
+ "\xe6\x8d\xa8\0" /* offset 16330 */
+ "\xe6\x8e\x83\0" /* offset 16334 */
+ "\xe6\x8f\xa4\0" /* offset 16338 */
+ "\xf0\xa2\xaf\xb1\0" /* offset 16342 */
+ "\xe6\x90\xa2\0" /* offset 16347 */
+ "\xe6\x8f\x85\0" /* offset 16351 */
+ "\xe6\x8e\xa9\0" /* offset 16355 */
+ "\xe3\xa8\xae\0" /* offset 16359 */
+ "\xe6\x91\xa9\0" /* offset 16363 */
+ "\xe6\x91\xbe\0" /* offset 16367 */
+ "\xe6\x92\x9d\0" /* offset 16371 */
+ "\xe6\x91\xb7\0" /* offset 16375 */
+ "\xe3\xa9\xac\0" /* offset 16379 */
+ "\xe6\x95\xac\0" /* offset 16383 */
+ "\xf0\xa3\x80\x8a\0" /* offset 16387 */
+ "\xe6\x97\xa3\0" /* offset 16392 */
+ "\xe6\x9b\xb8\0" /* offset 16396 */
+ "\xe6\x99\x89\0" /* offset 16400 */
+ "\xe3\xac\x99\0" /* offset 16404 */
+ "\xe3\xac\x88\0" /* offset 16408 */
+ "\xe3\xab\xa4\0" /* offset 16412 */
+ "\xe5\x86\x92\0" /* offset 16416 */
+ "\xe5\x86\x95\0" /* offset 16420 */
+ "\xe6\x9c\x80\0" /* offset 16424 */
+ "\xe6\x9a\x9c\0" /* offset 16428 */
+ "\xe8\x82\xad\0" /* offset 16432 */
+ "\xe4\x8f\x99\0" /* offset 16436 */
+ "\xe6\x9c\xa1\0" /* offset 16440 */
+ "\xe6\x9d\x9e\0" /* offset 16444 */
+ "\xe6\x9d\x93\0" /* offset 16448 */
+ "\xf0\xa3\x8f\x83\0" /* offset 16452 */
+ "\xe3\xad\x89\0" /* offset 16457 */
+ "\xe6\x9f\xba\0" /* offset 16461 */
+ "\xe6\x9e\x85\0" /* offset 16465 */
+ "\xe6\xa1\x92\0" /* offset 16469 */
+ "\xf0\xa3\x91\xad\0" /* offset 16473 */
+ "\xe6\xa2\x8e\0" /* offset 16478 */
+ "\xe6\xa0\x9f\0" /* offset 16482 */
+ "\xe6\xa4\x94\0" /* offset 16486 */
+ "\xe6\xa5\x82\0" /* offset 16490 */
+ "\xe6\xa6\xa3\0" /* offset 16494 */
+ "\xe6\xa7\xaa\0" /* offset 16498 */
+ "\xe6\xaa\xa8\0" /* offset 16502 */
+ "\xf0\xa3\x9a\xa3\0" /* offset 16506 */
+ "\xe6\xab\x9b\0" /* offset 16511 */
+ "\xe3\xb0\x98\0" /* offset 16515 */
+ "\xe6\xac\xa1\0" /* offset 16519 */
+ "\xf0\xa3\xa2\xa7\0" /* offset 16523 */
+ "\xe6\xad\x94\0" /* offset 16528 */
+ "\xe3\xb1\x8e\0" /* offset 16532 */
+ "\xe6\xad\xb2\0" /* offset 16536 */
+ "\xe6\xae\x9f\0" /* offset 16540 */
+ "\xe6\xae\xbb\0" /* offset 16544 */
+ "\xf0\xa3\xaa\x8d\0" /* offset 16548 */
+ "\xf0\xa1\xb4\x8b\0" /* offset 16553 */
+ "\xf0\xa3\xab\xba\0" /* offset 16558 */
+ "\xe6\xb1\x8e\0" /* offset 16563 */
+ "\xf0\xa3\xb2\xbc\0" /* offset 16567 */
+ "\xe6\xb2\xbf\0" /* offset 16572 */
+ "\xe6\xb3\x8d\0" /* offset 16576 */
+ "\xe6\xb1\xa7\0" /* offset 16580 */
+ "\xe6\xb4\x96\0" /* offset 16584 */
+ "\xe6\xb4\xbe\0" /* offset 16588 */
+ "\xe6\xb5\xa9\0" /* offset 16592 */
+ "\xe6\xb5\xb8\0" /* offset 16596 */
+ "\xe6\xb6\x85\0" /* offset 16600 */
+ "\xf0\xa3\xb4\x9e\0" /* offset 16604 */
+ "\xe6\xb4\xb4\0" /* offset 16609 */
+ "\xe6\xb8\xaf\0" /* offset 16613 */
+ "\xe6\xb9\xae\0" /* offset 16617 */
+ "\xe3\xb4\xb3\0" /* offset 16621 */
+ "\xe6\xbb\x87\0" /* offset 16625 */
+ "\xf0\xa3\xbb\x91\0" /* offset 16629 */
+ "\xe6\xb7\xb9\0" /* offset 16634 */
+ "\xe6\xbd\xae\0" /* offset 16638 */
+ "\xf0\xa3\xbd\x9e\0" /* offset 16642 */
+ "\xf0\xa3\xbe\x8e\0" /* offset 16647 */
+ "\xe6\xbf\x86\0" /* offset 16652 */
+ "\xe7\x80\xb9\0" /* offset 16656 */
+ "\xe7\x80\x9b\0" /* offset 16660 */
+ "\xe3\xb6\x96\0" /* offset 16664 */
+ "\xe7\x81\x8a\0" /* offset 16668 */
+ "\xe7\x81\xbd\0" /* offset 16672 */
+ "\xe7\x81\xb7\0" /* offset 16676 */
+ "\xe7\x82\xad\0" /* offset 16680 */
+ "\xf0\xa0\x94\xa5\0" /* offset 16684 */
+ "\xe7\x85\x85\0" /* offset 16689 */
+ "\xf0\xa4\x89\xa3\0" /* offset 16693 */
+ "\xe7\x86\x9c\0" /* offset 16698 */
+ "\xf0\xa4\x8e\xab\0" /* offset 16702 */
+ "\xe7\x88\xa8\0" /* offset 16707 */
+ "\xe7\x89\x90\0" /* offset 16711 */
+ "\xf0\xa4\x98\x88\0" /* offset 16715 */
+ "\xe7\x8a\x80\0" /* offset 16720 */
+ "\xe7\x8a\x95\0" /* offset 16724 */
+ "\xf0\xa4\x9c\xb5\0" /* offset 16728 */
+ "\xf0\xa4\xa0\x94\0" /* offset 16733 */
+ "\xe7\x8d\xba\0" /* offset 16738 */
+ "\xe7\x8e\x8b\0" /* offset 16742 */
+ "\xe3\xba\xac\0" /* offset 16746 */
+ "\xe7\x8e\xa5\0" /* offset 16750 */
+ "\xe3\xba\xb8\0" /* offset 16754 */
+ "\xe7\x91\x87\0" /* offset 16758 */
+ "\xe7\x91\x9c\0" /* offset 16762 */
+ "\xe7\x92\x85\0" /* offset 16766 */
+ "\xe7\x93\x8a\0" /* offset 16770 */
+ "\xe3\xbc\x9b\0" /* offset 16774 */
+ "\xe7\x94\xa4\0" /* offset 16778 */
+ "\xf0\xa4\xb0\xb6\0" /* offset 16782 */
+ "\xe7\x94\xbe\0" /* offset 16787 */
+ "\xf0\xa4\xb2\x92\0" /* offset 16791 */
+ "\xf0\xa2\x86\x9f\0" /* offset 16796 */
+ "\xe7\x98\x90\0" /* offset 16801 */
+ "\xf0\xa4\xbe\xa1\0" /* offset 16805 */
+ "\xf0\xa4\xbe\xb8\0" /* offset 16810 */
+ "\xf0\xa5\x81\x84\0" /* offset 16815 */
+ "\xe3\xbf\xbc\0" /* offset 16820 */
+ "\xe4\x80\x88\0" /* offset 16824 */
+ "\xf0\xa5\x83\xb3\0" /* offset 16828 */
+ "\xf0\xa5\x83\xb2\0" /* offset 16833 */
+ "\xf0\xa5\x84\x99\0" /* offset 16838 */
+ "\xf0\xa5\x84\xb3\0" /* offset 16843 */
+ "\xe7\x9c\x9e\0" /* offset 16848 */
+ "\xe7\x9c\x9f\0" /* offset 16852 */
+ "\xe7\x9e\x8b\0" /* offset 16856 */
+ "\xe4\x81\x86\0" /* offset 16860 */
+ "\xe4\x82\x96\0" /* offset 16864 */
+ "\xf0\xa5\x90\x9d\0" /* offset 16868 */
+ "\xe7\xa1\x8e\0" /* offset 16873 */
+ "\xe4\x83\xa3\0" /* offset 16877 */
+ "\xf0\xa5\x98\xa6\0" /* offset 16881 */
+ "\xf0\xa5\x9a\x9a\0" /* offset 16886 */
+ "\xf0\xa5\x9b\x85\0" /* offset 16891 */
+ "\xe7\xa7\xab\0" /* offset 16896 */
+ "\xe4\x84\xaf\0" /* offset 16900 */
+ "\xe7\xa9\x8a\0" /* offset 16904 */
+ "\xe7\xa9\x8f\0" /* offset 16908 */
+ "\xf0\xa5\xa5\xbc\0" /* offset 16912 */
+ "\xf0\xa5\xaa\xa7\0" /* offset 16917 */
+ "\xe7\xab\xae\0" /* offset 16922 */
+ "\xe4\x88\x82\0" /* offset 16926 */
+ "\xf0\xa5\xae\xab\0" /* offset 16930 */
+ "\xe7\xaf\x86\0" /* offset 16935 */
+ "\xe7\xaf\x89\0" /* offset 16939 */
+ "\xe4\x88\xa7\0" /* offset 16943 */
+ "\xf0\xa5\xb2\x80\0" /* offset 16947 */
+ "\xe7\xb3\x92\0" /* offset 16952 */
+ "\xe4\x8a\xa0\0" /* offset 16956 */
+ "\xe7\xb3\xa8\0" /* offset 16960 */
+ "\xe7\xb3\xa3\0" /* offset 16964 */
+ "\xe7\xb4\x80\0" /* offset 16968 */
+ "\xf0\xa5\xbe\x86\0" /* offset 16972 */
+ "\xe7\xb5\xa3\0" /* offset 16977 */
+ "\xe4\x8c\x81\0" /* offset 16981 */
+ "\xe7\xb7\x87\0" /* offset 16985 */
+ "\xe7\xb8\x82\0" /* offset 16989 */
+ "\xe7\xb9\x85\0" /* offset 16993 */
+ "\xe4\x8c\xb4\0" /* offset 16997 */
+ "\xf0\xa6\x88\xa8\0" /* offset 17001 */
+ "\xf0\xa6\x89\x87\0" /* offset 17006 */
+ "\xe4\x8d\x99\0" /* offset 17011 */
+ "\xf0\xa6\x8b\x99\0" /* offset 17015 */
+ "\xe7\xbd\xba\0" /* offset 17020 */
+ "\xf0\xa6\x8c\xbe\0" /* offset 17024 */
+ "\xe7\xbe\x95\0" /* offset 17029 */
+ "\xe7\xbf\xba\0" /* offset 17033 */
+ "\xf0\xa6\x93\x9a\0" /* offset 17037 */
+ "\xf0\xa6\x94\xa3\0" /* offset 17042 */
+ "\xe8\x81\xa0\0" /* offset 17047 */
+ "\xf0\xa6\x96\xa8\0" /* offset 17051 */
+ "\xe8\x81\xb0\0" /* offset 17056 */
+ "\xf0\xa3\x8d\x9f\0" /* offset 17060 */
+ "\xe4\x8f\x95\0" /* offset 17065 */
+ "\xe8\x82\xb2\0" /* offset 17069 */
+ "\xe8\x84\x83\0" /* offset 17073 */
+ "\xe4\x90\x8b\0" /* offset 17077 */
+ "\xe8\x84\xbe\0" /* offset 17081 */
+ "\xe5\xaa\xb5\0" /* offset 17085 */
+ "\xf0\xa6\x9e\xa7\0" /* offset 17089 */
+ "\xf0\xa6\x9e\xb5\0" /* offset 17094 */
+ "\xf0\xa3\x8e\x93\0" /* offset 17099 */
+ "\xf0\xa3\x8e\x9c\0" /* offset 17104 */
+ "\xe8\x88\x84\0" /* offset 17109 */
+ "\xe8\xbe\x9e\0" /* offset 17113 */
+ "\xe4\x91\xab\0" /* offset 17117 */
+ "\xe8\x8a\x91\0" /* offset 17121 */
+ "\xe8\x8a\x8b\0" /* offset 17125 */
+ "\xe8\x8a\x9d\0" /* offset 17129 */
+ "\xe5\x8a\xb3\0" /* offset 17133 */
+ "\xe8\x8a\xb1\0" /* offset 17137 */
+ "\xe8\x8a\xb3\0" /* offset 17141 */
+ "\xe8\x8a\xbd\0" /* offset 17145 */
+ "\xe8\x8b\xa6\0" /* offset 17149 */
+ "\xf0\xa6\xac\xbc\0" /* offset 17153 */
+ "\xe8\x8c\x9d\0" /* offset 17158 */
+ "\xe8\x8d\xa3\0" /* offset 17162 */
+ "\xe8\x8e\xad\0" /* offset 17166 */
+ "\xe8\x8c\xa3\0" /* offset 17170 */
+ "\xe8\x8e\xbd\0" /* offset 17174 */
+ "\xe8\x8f\xa7\0" /* offset 17178 */
+ "\xe8\x8d\x93\0" /* offset 17182 */
+ "\xe8\x8f\x8a\0" /* offset 17186 */
+ "\xe8\x8f\x8c\0" /* offset 17190 */
+ "\xe8\x8f\x9c\0" /* offset 17194 */
+ "\xf0\xa6\xb0\xb6\0" /* offset 17198 */
+ "\xf0\xa6\xb5\xab\0" /* offset 17203 */
+ "\xf0\xa6\xb3\x95\0" /* offset 17208 */
+ "\xe4\x94\xab\0" /* offset 17213 */
+ "\xe8\x93\xb1\0" /* offset 17217 */
+ "\xe8\x93\xb3\0" /* offset 17221 */
+ "\xe8\x94\x96\0" /* offset 17225 */
+ "\xf0\xa7\x8f\x8a\0" /* offset 17229 */
+ "\xe8\x95\xa4\0" /* offset 17234 */
+ "\xf0\xa6\xbc\xac\0" /* offset 17238 */
+ "\xe4\x95\x9d\0" /* offset 17243 */
+ "\xe4\x95\xa1\0" /* offset 17247 */
+ "\xf0\xa6\xbe\xb1\0" /* offset 17251 */
+ "\xf0\xa7\x83\x92\0" /* offset 17256 */
+ "\xe4\x95\xab\0" /* offset 17261 */
+ "\xe8\x99\x90\0" /* offset 17265 */
+ "\xe8\x99\xa7\0" /* offset 17269 */
+ "\xe8\x99\xa9\0" /* offset 17273 */
+ "\xe8\x9a\xa9\0" /* offset 17277 */
+ "\xe8\x9a\x88\0" /* offset 17281 */
+ "\xe8\x9c\x8e\0" /* offset 17285 */
+ "\xe8\x9b\xa2\0" /* offset 17289 */
+ "\xe8\x9c\xa8\0" /* offset 17293 */
+ "\xe8\x9d\xab\0" /* offset 17297 */
+ "\xe8\x9e\x86\0" /* offset 17301 */
+ "\xe4\x97\x97\0" /* offset 17305 */
+ "\xe8\x9f\xa1\0" /* offset 17309 */
+ "\xe8\xa0\x81\0" /* offset 17313 */
+ "\xe4\x97\xb9\0" /* offset 17317 */
+ "\xe8\xa1\xa0\0" /* offset 17321 */
+ "\xf0\xa7\x99\xa7\0" /* offset 17325 */
+ "\xe8\xa3\x97\0" /* offset 17330 */
+ "\xe8\xa3\x9e\0" /* offset 17334 */
+ "\xe4\x98\xb5\0" /* offset 17338 */
+ "\xe8\xa3\xba\0" /* offset 17342 */
+ "\xe3\x92\xbb\0" /* offset 17346 */
+ "\xf0\xa7\xa2\xae\0" /* offset 17350 */
+ "\xf0\xa7\xa5\xa6\0" /* offset 17355 */
+ "\xe4\x9a\xbe\0" /* offset 17360 */
+ "\xe4\x9b\x87\0" /* offset 17364 */
+ "\xe8\xaa\xa0\0" /* offset 17368 */
+ "\xf0\xa7\xb2\xa8\0" /* offset 17372 */
+ "\xe8\xb2\xab\0" /* offset 17377 */
+ "\xe8\xb3\x81\0" /* offset 17381 */
+ "\xe8\xb4\x9b\0" /* offset 17385 */
+ "\xe8\xb5\xb7\0" /* offset 17389 */
+ "\xf0\xa7\xbc\xaf\0" /* offset 17393 */
+ "\xf0\xa0\xa0\x84\0" /* offset 17398 */
+ "\xe8\xb7\x8b\0" /* offset 17403 */
+ "\xe8\xb6\xbc\0" /* offset 17407 */
+ "\xe8\xb7\xb0\0" /* offset 17411 */
+ "\xf0\xa0\xa3\x9e\0" /* offset 17415 */
+ "\xe8\xbb\x94\0" /* offset 17420 */
+ "\xf0\xa8\x97\x92\0" /* offset 17424 */
+ "\xf0\xa8\x97\xad\0" /* offset 17429 */
+ "\xe9\x82\x94\0" /* offset 17434 */
+ "\xe9\x83\xb1\0" /* offset 17438 */
+ "\xe9\x84\x91\0" /* offset 17442 */
+ "\xf0\xa8\x9c\xae\0" /* offset 17446 */
+ "\xe9\x84\x9b\0" /* offset 17451 */
+ "\xe9\x88\xb8\0" /* offset 17455 */
+ "\xe9\x8b\x97\0" /* offset 17459 */
+ "\xe9\x8b\x98\0" /* offset 17463 */
+ "\xe9\x89\xbc\0" /* offset 17467 */
+ "\xe9\x8f\xb9\0" /* offset 17471 */
+ "\xe9\x90\x95\0" /* offset 17475 */
+ "\xf0\xa8\xaf\xba\0" /* offset 17479 */
+ "\xe9\x96\x8b\0" /* offset 17484 */
+ "\xe4\xa6\x95\0" /* offset 17488 */
+ "\xe9\x96\xb7\0" /* offset 17492 */
+ "\xf0\xa8\xb5\xb7\0" /* offset 17496 */
+ "\xe4\xa7\xa6\0" /* offset 17501 */
+ "\xe9\x9b\x83\0" /* offset 17505 */
+ "\xe5\xb6\xb2\0" /* offset 17509 */
+ "\xe9\x9c\xa3\0" /* offset 17513 */
+ "\xf0\xa9\x85\x85\0" /* offset 17517 */
+ "\xf0\xa9\x88\x9a\0" /* offset 17522 */
+ "\xe4\xa9\xae\0" /* offset 17527 */
+ "\xe4\xa9\xb6\0" /* offset 17531 */
+ "\xe9\x9f\xa0\0" /* offset 17535 */
+ "\xf0\xa9\x90\x8a\0" /* offset 17539 */
+ "\xe4\xaa\xb2\0" /* offset 17544 */
+ "\xf0\xa9\x92\x96\0" /* offset 17548 */
+ "\xe9\xa0\xa9\0" /* offset 17553 */
+ "\xf0\xa9\x96\xb6\0" /* offset 17557 */
+ "\xe9\xa3\xa2\0" /* offset 17562 */
+ "\xe4\xac\xb3\0" /* offset 17566 */
+ "\xe9\xa4\xa9\0" /* offset 17570 */
+ "\xe9\xa6\xa7\0" /* offset 17574 */
+ "\xe9\xa7\x82\0" /* offset 17578 */
+ "\xe9\xa7\xbe\0" /* offset 17582 */
+ "\xe4\xaf\x8e\0" /* offset 17586 */
+ "\xf0\xa9\xac\xb0\0" /* offset 17590 */
+ "\xe9\xb1\x80\0" /* offset 17595 */
+ "\xe9\xb3\xbd\0" /* offset 17599 */
+ "\xe4\xb3\x8e\0" /* offset 17603 */
+ "\xe4\xb3\xad\0" /* offset 17607 */
+ "\xe9\xb5\xa7\0" /* offset 17611 */
+ "\xf0\xaa\x83\x8e\0" /* offset 17615 */
+ "\xe4\xb3\xb8\0" /* offset 17620 */
+ "\xf0\xaa\x84\x85\0" /* offset 17624 */
+ "\xf0\xaa\x88\x8e\0" /* offset 17629 */
+ "\xf0\xaa\x8a\x91\0" /* offset 17634 */
+ "\xe4\xb5\x96\0" /* offset 17639 */
+ "\xe9\xbb\xbe\0" /* offset 17643 */
+ "\xe9\xbc\x85\0" /* offset 17647 */
+ "\xe9\xbc\x8f\0" /* offset 17651 */
+ "\xe9\xbc\x96\0" /* offset 17655 */
+ "\xf0\xaa\x98\x80\0" /* offset 17659 */;
typedef struct
{
@@ -12556,6 +12743,8 @@ static const decomposition_step decomp_step_table[] =
{ 0x0fa2b, 0x098fc, 0x00000 },
{ 0x0fa2c, 0x09928, 0x00000 },
{ 0x0fa2d, 0x09db4, 0x00000 },
+ { 0x0fa2e, 0x090de, 0x00000 },
+ { 0x0fa2f, 0x096b7, 0x00000 },
{ 0x0fa30, 0x04fae, 0x00000 },
{ 0x0fa31, 0x050e7, 0x00000 },
{ 0x0fa32, 0x0514d, 0x00000 },
@@ -12761,6 +12950,8 @@ static const decomposition_step decomp_step_table[] =
{ 0x1109a, 0x11099, 0x110ba },
{ 0x1109c, 0x1109b, 0x110ba },
{ 0x110ab, 0x110a5, 0x110ba },
+ { 0x1112e, 0x11131, 0x11127 },
+ { 0x1112f, 0x11132, 0x11127 },
{ 0x1d15e, 0x1d157, 0x1d165 },
{ 0x1d15f, 0x1d158, 0x1d165 },
{ 0x1d160, 0x1d15f, 0x1d16e },
diff --git a/glib/glib/guniprop.c b/glib/glib/guniprop.c
index 420d58a..2211818 100644
--- a/glib/glib/guniprop.c
+++ b/glib/glib/guniprop.c
@@ -468,13 +468,12 @@ g_unichar_iswide (gunichar c)
{
/* See NOTE earlier for how to update this table. */
static const struct Interval wide[] = {
- {0x1100, 0x115F}, {0x11A3, 0x11A7}, {0x11FA, 0x11FF}, {0x2329, 0x232A},
- {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB},
- {0x3000, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312D},
- {0x3131, 0x318E}, {0x3190, 0x31BA}, {0x31C0, 0x31E3}, {0x31F0, 0x321E},
- {0x3220, 0x3247}, {0x3250, 0x32FE}, {0x3300, 0x4DBF}, {0x4E00, 0xA48C},
- {0xA490, 0xA4C6}, {0xA960, 0xA97C}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6},
- {0xD7CB, 0xD7FB}, {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52},
+ {0x1100, 0x115F}, {0x2329, 0x232A}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3},
+ {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3000, 0x303E}, {0x3041, 0x3096},
+ {0x3099, 0x30FF}, {0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA},
+ {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x32FE},
+ {0x3300, 0x4DBF}, {0x4E00, 0xA48C}, {0xA490, 0xA4C6}, {0xA960, 0xA97C},
+ {0xAC00, 0xD7A3}, {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52},
{0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, {0xFFE0, 0xFFE6},
{0x1B000, 0x1B001}, {0x1F200, 0x1F202}, {0x1F210, 0x1F23A}, {0x1F240,
0x1F248}, {0x1F250, 0x1F251}, {0x20000, 0x2FFFD}, {0x30000, 0x3FFFD}
@@ -753,6 +752,9 @@ get_locale_type (void)
g_free (tem);
#else
const char *locale = setlocale (LC_CTYPE, NULL);
+
+ if (locale == NULL)
+ return LOCALE_NORMAL;
#endif
switch (locale[0])
diff --git a/glib/glib/gurifuncs.c b/glib/glib/gurifuncs.c
index d438205..b2128a2 100644
--- a/glib/glib/gurifuncs.c
+++ b/glib/glib/gurifuncs.c
@@ -139,7 +139,8 @@ g_uri_unescape_segment (const char *escaped_string,
/**
* g_uri_unescape_string:
* @escaped_string: an escaped string to be unescaped.
- * @illegal_characters: an optional string of illegal characters not to be allowed.
+ * @illegal_characters: (allow-none): a string of illegal characters not to be
+ * allowed, or %NULL.
*
* Unescapes a whole escaped string.
*
@@ -217,8 +218,8 @@ g_uri_parse_scheme (const char *uri)
/**
* g_uri_escape_string:
* @unescaped: the unescaped input string.
- * @reserved_chars_allowed: a string of reserved characters that are
- * allowed to be used, or %NULL.
+ * @reserved_chars_allowed: (allow-none): a string of reserved characters that
+ * are allowed to be used, or %NULL.
* @allow_utf8: %TRUE if the result can include UTF-8 characters.
*
* Escapes a string for use in a URI.
diff --git a/glib/glib/gurifuncs.h b/glib/glib/gurifuncs.h
index 6e6b739..9f89770 100644
--- a/glib/glib/gurifuncs.h
+++ b/glib/glib/gurifuncs.h
@@ -20,13 +20,13 @@
* Author: Alexander Larsson <alexl@redhat.com>
*/
+#ifndef __G_URI_FUNCS_H__
+#define __G_URI_FUNCS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_URI_FUNCS_H__
-#define __G_URI_FUNCS_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -66,12 +66,16 @@ G_BEGIN_DECLS
**/
#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":"
+GLIB_AVAILABLE_IN_ALL
char * g_uri_unescape_string (const char *escaped_string,
const char *illegal_characters);
+GLIB_AVAILABLE_IN_ALL
char * g_uri_unescape_segment (const char *escaped_string,
const char *escaped_string_end,
const char *illegal_characters);
+GLIB_AVAILABLE_IN_ALL
char * g_uri_parse_scheme (const char *uri);
+GLIB_AVAILABLE_IN_ALL
char * g_uri_escape_string (const char *unescaped,
const char *reserved_chars_allowed,
gboolean allow_utf8);
diff --git a/glib/glib/gutf8.c b/glib/glib/gutf8.c
index e61d33d..9244fe8 100644
--- a/glib/glib/gutf8.c
+++ b/glib/glib/gutf8.c
@@ -104,22 +104,14 @@
* a point above 0x0010ffff, since UTF-16 couldn't represent it.
*
* The second check covers surrogate pairs (category Cs).
- *
- * The last two checks cover "Noncharacter": defined as:
- * "A code point that is permanently reserved for
- * internal use, and that should never be interchanged. In
- * Unicode 3.1, these consist of the values U+nFFFE and U+nFFFF
- * (where n is from 0 to 10_16) and the values U+FDD0..U+FDEF."
*
* @param Char the character
*/
#define UNICODE_VALID(Char) \
((Char) < 0x110000 && \
- (((Char) & 0xFFFFF800) != 0xD800) && \
- ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \
- ((Char) & 0xFFFE) != 0xFFFE)
-
-
+ (((Char) & 0xFFFFF800) != 0xD800))
+
+
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,
diff --git a/glib/glib/gutils.c b/glib/glib/gutils.c
index 38b5e44..2620cb6 100644
--- a/glib/glib/gutils.c
+++ b/glib/glib/gutils.c
@@ -60,6 +60,7 @@
#include "gutils.h"
#include "glib-init.h"
+#include "glib-private.h"
#include "genviron.h"
#include "gfileutils.h"
#include "ggettext.h"
@@ -423,9 +424,9 @@ g_find_program_in_path (const gchar *program)
#if defined(G_OS_UNIX) || defined(G_OS_BEOS)
if (path == NULL)
{
- /* There is no `PATH' in the environment. The default
+ /* 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'.
+ * the path 'confstr' returns for '_CS_PATH'.
*/
/* In GLib we put . last, for security, and don't use the
@@ -509,7 +510,7 @@ g_find_program_in_path (const gchar *program)
if (p == path)
/* Two adjacent colons, or a colon at the beginning or the end
- * of `PATH' means to search the current directory.
+ * of 'PATH' means to search the current directory.
*/
startp = name + 1;
else
@@ -576,21 +577,12 @@ g_find_program_in_path (const gchar *program)
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
+typedef struct
+{
+ gchar *user_name;
+ gchar *real_name;
+ gchar *home_dir;
+} UserDatabaseEntry;
static gchar *g_user_data_dir = NULL;
static gchar **g_system_data_dirs = NULL;
@@ -654,288 +646,163 @@ get_windows_directory_root (void)
#endif
/* HOLDS: g_utils_global_lock */
-static void
-g_get_any_init_do (void)
+static UserDatabaseEntry *
+g_get_user_database_entry (void)
{
- gchar hostname[100];
-
- g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
-
- if (g_tmp_dir == NULL || *g_tmp_dir == '\0')
- {
- g_free (g_tmp_dir);
- g_tmp_dir = g_strdup (g_getenv ("TMP"));
- }
-
- if (g_tmp_dir == NULL || *g_tmp_dir == '\0')
- {
- g_free (g_tmp_dir);
- g_tmp_dir = g_strdup (g_getenv ("TEMP"));
- }
+ static UserDatabaseEntry *entry;
-#ifdef G_OS_WIN32
- if (g_tmp_dir == NULL || *g_tmp_dir == '\0')
+ if (g_once_init_enter (&entry))
{
- g_free (g_tmp_dir);
- g_tmp_dir = get_windows_directory_root ();
- }
-#else
-
-#ifdef P_tmpdir
- if (g_tmp_dir == NULL || *g_tmp_dir == '\0')
- {
- gsize k;
- g_free (g_tmp_dir);
- 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 == NULL || *g_tmp_dir == '\0')
- {
- g_free (g_tmp_dir);
- g_tmp_dir = g_strdup (g_getenv ("/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"));
+ static UserDatabaseEntry e;
- /* 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;
+ {
+ 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;
+ 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;
+ 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;
-
+ 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;
+ 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 */
+ /* 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;
+ 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 */
+ 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
- * successful.
- */
- 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);
+
+ 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
+ * successful.
+ */
+ 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);
+
+ if (!pw)
+ {
+ pw = getpwuid (getuid ());
+ }
+ if (pw)
+ {
+ e.user_name = g_strdup (pw->pw_name);
+
+#ifndef __BIONIC__
+ 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]);
+ e.real_name = g_strjoinv (pw->pw_name, name_parts);
+ g_strfreev (gecos_fields);
+ g_strfreev (name_parts);
+ }
+#endif
+
+ if (!e.home_dir)
+ e.home_dir = g_strdup (pw->pw_dir);
+ }
+ g_free (buffer);
}
- 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);
+ guint len = UNLEN+1;
+ wchar_t buffer[UNLEN+1];
+
+ if (GetUserNameW (buffer, (LPDWORD) &len))
+ {
+ e.user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL);
+ e.real_name = g_strdup (e.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));
+ /* change '\\' in %HOME% to '/' */
+ g_strdelimit (e.home_dir, "\\",'/');
#endif
- g_host_name = g_strdup (hostname_fail ? "localhost" : hostname);
- }
+ if (!e.user_name)
+ e.user_name = g_strdup ("somebody");
+ if (!e.real_name)
+ e.real_name = g_strdup ("Unknown");
-#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 ();
-}
+ g_once_init_leave (&entry, &e);
+ }
-static inline void
-g_get_any_init_locked (void)
-{
- G_LOCK (g_utils_global);
- g_get_any_init ();
- G_UNLOCK (g_utils_global);
+ return entry;
}
-
/**
* g_get_user_name:
*
@@ -949,8 +816,11 @@ g_get_any_init_locked (void)
const gchar *
g_get_user_name (void)
{
- g_get_any_init_locked ();
- return g_user_name;
+ UserDatabaseEntry *entry;
+
+ entry = g_get_user_database_entry ();
+
+ return entry->user_name;
}
/**
@@ -967,65 +837,182 @@ g_get_user_name (void)
const gchar *
g_get_real_name (void)
{
- g_get_any_init_locked ();
- return g_real_name;
+ UserDatabaseEntry *entry;
+
+ entry = g_get_user_database_entry ();
+
+ return entry->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.
- *
- * One of the reasons for this decision is that applications in many
- * cases need special handling to deal with the case where
- * <envar>HOME</envar> is
- * <simplelist>
- * <member>Not owned by the user</member>
- * <member>Not writeable</member>
- * <member>Not even readable</member>
- * </simplelist>
- * Since applications are in general <emphasis>not</emphasis> written
- * to deal with these situations it was considered better to make
- * g_get_home_dir() not pay attention to <envar>HOME</envar> and to
- * return the real home directory for the user. If applications
- * want to pay attention to <envar>HOME</envar>, they can do:
- * |[
- * const char *homedir = g_getenv ("HOME");
- * if (!homedir)
- * homedir = g_get_home_dir (<!-- -->);
- * ]|
+ * Gets the current user's home directory.
+ *
+ * As with most UNIX tools, this function will return the value of the
+ * <envar>HOME</envar> environment variable if it is set to an existing
+ * absolute path name, falling back to the <filename>passwd</filename>
+ * file in the case that it is unset.
+ *
+ * If the path given in <envar>HOME</envar> is non-absolute, does not
+ * exist, or is not a directory, the result is undefined.
+ *
+ * <note><para>
+ * Before version 2.36 this function would ignore the
+ * <envar>HOME</envar> environment variable, taking the value from the
+ * <filename>passwd</filename> database instead. This was changed to
+ * increase the compatibility of GLib with other programs (and the XDG
+ * basedir specification) and to increase testability of programs
+ * based on GLib (by making it easier to run them from test
+ * frameworks).
+ * </para><para>
+ * If your program has a strong requirement for either the new or the
+ * old behaviour (and if you don't wish to increase your GLib
+ * dependency to ensure that the new behaviour is in effect) then you
+ * should either directly check the <envar>HOME</envar> environment
+ * variable yourself or unset it before calling any functions in GLib.
+ * </para></note>
*
* Returns: the current user's home directory
*/
const gchar *
g_get_home_dir (void)
{
- g_get_any_init_locked ();
- return g_home_dir;
+ static gchar *home_dir;
+
+ if (g_once_init_enter (&home_dir))
+ {
+ gchar *tmp;
+
+ /* We first check HOME and use it if it is set */
+ tmp = g_strdup (g_getenv ("HOME"));
+
+#ifdef G_OS_WIN32
+ /* Only believe HOME if it is an absolute path and exists.
+ *
+ * We only do this check on Windows for a couple of reasons.
+ * Historically, we only did it there because we used to ignore $HOME
+ * on UNIX. There are concerns about enabling it now on UNIX because
+ * of things like autofs. In short, if the user has a bogus value in
+ * $HOME then they get what they pay for...
+ */
+ if (tmp)
+ {
+ if (!(g_path_is_absolute (tmp) &&
+ g_file_test (tmp, G_FILE_TEST_IS_DIR)))
+ {
+ g_free (tmp);
+ tmp = NULL;
+ }
+ }
+
+ /* In case HOME is Unix-style (it happens), convert it to
+ * Windows style.
+ */
+ if (tmp)
+ {
+ gchar *p;
+ while ((p = strchr (tmp, '/')) != NULL)
+ *p = '\\';
+ }
+
+ if (!tmp)
+ {
+ /* USERPROFILE is probably the closest equivalent to $HOME? */
+ if (g_getenv ("USERPROFILE") != NULL)
+ tmp = g_strdup (g_getenv ("USERPROFILE"));
+ }
+
+ if (!tmp)
+ tmp = get_special_folder (CSIDL_PROFILE);
+
+ if (!tmp)
+ tmp = get_windows_directory_root ();
+#endif /* G_OS_WIN32 */
+
+ if (!tmp)
+ {
+ /* If we didn't get it from any of those methods, we will have
+ * to read the user database entry.
+ */
+ UserDatabaseEntry *entry;
+
+ entry = g_get_user_database_entry ();
+
+ /* Strictly speaking, we should copy this, but we know that
+ * neither will ever be freed, so don't bother...
+ */
+ tmp = entry->home_dir;
+ }
+
+ g_once_init_leave (&home_dir, tmp);
+ }
+
+ return 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 or the empty string.
+ * Gets the directory to use for temporary files.
+ *
+ * On UNIX, this is taken from the <envar>TMPDIR</envar> environment
+ * variable. If the variable is not set, <literal>P_tmpdir</literal> is
+ * used, as defined by the system C library. Failing that, a hard-coded
+ * default of "/tmp" is returned.
+ *
+ * On Windows, the <envar>TEMP</envar> environment variable is used,
+ * with the root directory of the Windows installation (eg: "C:\") used
+ * as a default.
+ *
+ * The encoding of the returned string is system-defined. On Windows, it
+ * is always UTF-8. The return value is never %NULL or the empty string.
*
* Returns: the directory to use for temporary files.
*/
const gchar *
g_get_tmp_dir (void)
{
- g_get_any_init_locked ();
- return g_tmp_dir;
+ static gchar *tmp_dir;
+
+ if (g_once_init_enter (&tmp_dir))
+ {
+ gchar *tmp;
+
+#ifdef G_OS_WIN32
+ tmp = g_strdup (g_getenv ("TEMP"));
+
+ if (tmp == NULL || *tmp == '\0')
+ {
+ g_free (tmp);
+ tmp = get_windows_directory_root ();
+ }
+#else /* G_OS_WIN32 */
+ tmp = g_strdup (g_getenv ("TMPDIR"));
+
+#ifdef P_tmpdir
+ if (tmp == NULL || *tmp == '\0')
+ {
+ gsize k;
+ g_free (tmp);
+ tmp = g_strdup (P_tmpdir);
+ k = strlen (tmp);
+ if (k > 1 && G_IS_DIR_SEPARATOR (tmp[k - 1]))
+ tmp[k - 1] = '\0';
+ }
+#endif /* P_tmpdir */
+
+ if (tmp == NULL || *tmp == '\0')
+ {
+ g_free (tmp);
+ tmp = g_strdup ("/tmp");
+ }
+#endif /* !G_OS_WIN32 */
+
+ g_once_init_leave (&tmp_dir, tmp);
+ }
+
+ return tmp_dir;
}
/**
@@ -1051,8 +1038,24 @@ g_get_tmp_dir (void)
const gchar *
g_get_host_name (void)
{
- g_get_any_init_locked ();
- return g_host_name;
+ static gchar *hostname;
+
+ if (g_once_init_enter (&hostname))
+ {
+ gboolean failed;
+ gchar tmp[100];
+
+#ifndef G_OS_WIN32
+ failed = (gethostname (tmp, sizeof (tmp)) == -1);
+#else
+ DWORD size = sizeof (tmp);
+ failed = (!GetComputerName (tmp, &size));
+#endif
+
+ g_once_init_leave (&hostname, g_strdup (failed ? "localhost" : tmp));
+ }
+
+ return hostname;
}
G_LOCK_DEFINE_STATIC (g_prgname);
@@ -1070,7 +1073,7 @@ static gchar *g_prgname = NULL;
* Returns: the name of the program. The returned string belongs
* to GLib and must not be modified or freed.
*/
-gchar*
+const gchar*
g_get_prgname (void)
{
gchar* retval;
@@ -1228,14 +1231,12 @@ g_get_user_data_dir (void)
#endif
if (!data_dir || !data_dir[0])
{
- g_get_any_init ();
+ const gchar *home_dir = g_get_home_dir ();
- if (g_home_dir)
- data_dir = g_build_filename (g_home_dir, ".local",
- "share", NULL);
+ if (home_dir)
+ data_dir = g_build_filename (home_dir, ".local", "share", NULL);
else
- data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local",
- "share", NULL);
+ data_dir = g_build_filename (g_get_tmp_dir (), g_get_user_name (), ".local", "share", NULL);
}
g_user_data_dir = data_dir;
@@ -1265,12 +1266,12 @@ g_init_user_config_dir (void)
#endif
if (!config_dir || !config_dir[0])
{
- g_get_any_init ();
+ const gchar *home_dir = g_get_home_dir ();
- if (g_home_dir)
- config_dir = g_build_filename (g_home_dir, ".config", NULL);
+ if (home_dir)
+ config_dir = g_build_filename (home_dir, ".config", NULL);
else
- config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL);
+ config_dir = g_build_filename (g_get_tmp_dir (), g_get_user_name (), ".config", NULL);
}
g_user_config_dir = config_dir;
@@ -1348,12 +1349,12 @@ g_get_user_cache_dir (void)
#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);
+ const gchar *home_dir = g_get_home_dir ();
+
+ if (home_dir)
+ cache_dir = g_build_filename (home_dir, ".cache", NULL);
else
- cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL);
+ cache_dir = g_build_filename (g_get_tmp_dir (), g_get_user_name (), ".cache", NULL);
}
g_user_cache_dir = cache_dir;
}
@@ -1683,8 +1684,7 @@ load_user_special_dirs (void)
if (is_relative)
{
- g_get_any_init ();
- g_user_special_dirs[directory] = g_build_filename (g_home_dir, d, NULL);
+ g_user_special_dirs[directory] = g_build_filename (g_get_home_dir (), d, NULL);
}
else
g_user_special_dirs[directory] = g_strdup (d);
@@ -1790,12 +1790,7 @@ g_get_user_special_dir (GUserDirectory directory)
/* Special-case desktop for historical compatibility */
if (g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] == NULL)
- {
- g_get_any_init ();
-
- g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] =
- g_build_filename (g_home_dir, "Desktop", NULL);
- }
+ g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = g_build_filename (g_get_home_dir (), "Desktop", NULL);
}
G_UNLOCK (g_utils_global);
@@ -1860,7 +1855,7 @@ get_module_share_dir (gconstpointer address)
}
const gchar * const *
-g_win32_get_system_data_dirs_for_module (void (*address_of_function)())
+g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void))
{
GArray *data_dirs;
HMODULE hmodule;
@@ -2153,6 +2148,9 @@ g_format_size (guint64 size)
* Flags to modify the format of the string returned by g_format_size_full().
*/
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
/**
* g_format_size_full:
* @size: a size in bytes
@@ -2286,6 +2284,8 @@ g_format_size_full (guint64 size,
return g_string_free (string, FALSE);
}
+#pragma GCC diagnostic pop
+
/**
* g_format_size_for_display:
* @size: a size in bytes
@@ -2320,6 +2320,11 @@ g_format_size_for_display (goffset size)
if (size < (goffset) MEBIBYTE_FACTOR)
{
displayed_size = (gdouble) size / (gdouble) KIBIBYTE_FACTOR;
+ /* Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to
+ * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of
+ * compatibility. Users will not see this string unless a program is using this deprecated function.
+ * Please translate as literally as possible.
+ */
return g_strdup_printf (_("%.1f KB"), displayed_size);
}
else if (size < (goffset) GIBIBYTE_FACTOR)
@@ -2354,58 +2359,78 @@ g_format_size_for_display (goffset size)
/* Binary compatibility versions. Not for newly compiled code. */
-#undef g_find_program_in_path
+_GLIB_EXTERN const gchar *g_get_user_name_utf8 (void);
+_GLIB_EXTERN const gchar *g_get_real_name_utf8 (void);
+_GLIB_EXTERN const gchar *g_get_home_dir_utf8 (void);
+_GLIB_EXTERN const gchar *g_get_tmp_dir_utf8 (void);
+_GLIB_EXTERN gchar *g_find_program_in_path_utf8 (const gchar *program);
-gchar*
-g_find_program_in_path (const gchar *program)
+gchar *
+g_find_program_in_path_utf8 (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;
+ return g_find_program_in_path (program);
}
-#undef g_get_user_name
-
-const gchar *
-g_get_user_name (void)
-{
- g_get_any_init_locked ();
- return g_user_name_cp;
-}
+const gchar *g_get_user_name_utf8 (void) { return g_get_user_name (); }
+const gchar *g_get_real_name_utf8 (void) { return g_get_real_name (); }
+const gchar *g_get_home_dir_utf8 (void) { return g_get_home_dir (); }
+const gchar *g_get_tmp_dir_utf8 (void) { return g_get_tmp_dir (); }
-#undef g_get_real_name
+#endif
-const gchar *
-g_get_real_name (void)
+/* Private API:
+ *
+ * Returns %TRUE if the current process was executed as setuid (or an
+ * equivalent __libc_enable_secure is available). See:
+ * http://osdir.com/ml/linux.lfs.hardened/2007-04/msg00032.html
+ */
+gboolean
+g_check_setuid (void)
{
- g_get_any_init_locked ();
- return g_real_name_cp;
-}
-
-#undef g_get_home_dir
+ /* TODO: get __libc_enable_secure exported from glibc.
+ * See http://www.openwall.com/lists/owl-dev/2012/08/14/1
+ */
+#if 0 && defined(HAVE_LIBC_ENABLE_SECURE)
+ {
+ /* See glibc/include/unistd.h */
+ extern int __libc_enable_secure;
+ return __libc_enable_secure;
+ }
+#elif defined(HAVE_ISSETUGID)
+ /* BSD: http://www.freebsd.org/cgi/man.cgi?query=issetugid&sektion=2 */
+ return issetugid ();
+#elif defined(G_OS_UNIX)
+ uid_t ruid, euid, suid; /* Real, effective and saved user ID's */
+ gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */
-const gchar *
-g_get_home_dir (void)
-{
- g_get_any_init_locked ();
- return g_home_dir_cp;
-}
+ static gsize check_setuid_initialised;
+ static gboolean is_setuid;
-#undef g_get_tmp_dir
+ if (g_once_init_enter (&check_setuid_initialised))
+ {
+#ifdef HAVE_GETRESUID
+ /* These aren't in the header files, so we prototype them here.
+ */
+ int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
+ int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
+
+ if (getresuid (&ruid, &euid, &suid) != 0 ||
+ getresgid (&rgid, &egid, &sgid) != 0)
+#endif /* HAVE_GETRESUID */
+ {
+ suid = ruid = getuid ();
+ sgid = rgid = getgid ();
+ euid = geteuid ();
+ egid = getegid ();
+ }
-const gchar *
-g_get_tmp_dir (void)
-{
- g_get_any_init_locked ();
- return g_tmp_dir_cp;
-}
+ is_setuid = (ruid != euid || ruid != suid ||
+ rgid != egid || rgid != sgid);
+ g_once_init_leave (&check_setuid_initialised, 1);
+ }
+ return is_setuid;
+#else
+ return FALSE;
#endif
+}
diff --git a/glib/glib/gutils.h b/glib/glib/gutils.h
index 213a39f..472f3c2 100644
--- a/glib/glib/gutils.h
+++ b/glib/glib/gutils.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_UTILS_H__
+#define __G_UTILS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_UTILS_H__
-#define __G_UTILS_H__
-
#include <glib/gtypes.h>
#include <stdarg.h>
@@ -49,9 +49,9 @@ G_BEGIN_DECLS
# endif /* va_list is a pointer */
#endif /* !G_VA_COPY */
-/* inlining hassle. for compilers that don't allow the `inline' keyword,
+/* 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'.
+ * 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
@@ -74,43 +74,49 @@ G_BEGIN_DECLS
# endif
#endif
#ifdef G_IMPLEMENT_INLINES
-# define G_INLINE_FUNC
+# define G_INLINE_FUNC _GLIB_EXTERN
# undef G_CAN_INLINE
#elif defined (__GNUC__)
# define G_INLINE_FUNC static __inline __attribute__ ((unused))
#elif defined (G_CAN_INLINE)
# define G_INLINE_FUNC static inline
#else /* can't inline */
-# define G_INLINE_FUNC
+# define G_INLINE_FUNC _GLIB_EXTERN
#endif /* !G_INLINE_FUNC */
-#ifndef __GTK_DOC_IGNORE__
-#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
-#endif
-
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_name (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_real_name (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_home_dir (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_tmp_dir (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_host_name (void);
-gchar * g_get_prgname (void);
+GLIB_AVAILABLE_IN_ALL
+const gchar * g_get_prgname (void);
+GLIB_AVAILABLE_IN_ALL
void g_set_prgname (const gchar *prgname);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_application_name (void);
+GLIB_AVAILABLE_IN_ALL
void g_set_application_name (const gchar *application_name);
+GLIB_AVAILABLE_IN_ALL
void g_reload_user_special_dirs_cache (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_data_dir (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_config_dir (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_cache_dir (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * const * g_get_system_data_dirs (void);
#ifdef G_OS_WIN32
/* This functions is not part of the public GLib API */
+GLIB_AVAILABLE_IN_ALL
const gchar * const * g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void));
#endif
@@ -127,8 +133,10 @@ _g_win32_get_system_data_dirs (void)
#define g_get_system_data_dirs _g_win32_get_system_data_dirs
#endif
+GLIB_AVAILABLE_IN_ALL
const gchar * const * g_get_system_config_dirs (void);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_runtime_dir (void);
/**
@@ -166,6 +174,7 @@ typedef enum {
G_USER_N_DIRECTORIES
} GUserDirectory;
+GLIB_AVAILABLE_IN_ALL
const gchar * g_get_user_special_dir (GUserDirectory directory);
/**
@@ -185,19 +194,24 @@ struct _GDebugKey
/* Miscellaneous utility functions
*/
+GLIB_AVAILABLE_IN_ALL
guint g_parse_debug_string (const gchar *string,
const GDebugKey *keys,
guint nkeys);
+GLIB_AVAILABLE_IN_ALL
gint g_snprintf (gchar *string,
gulong n,
gchar const *format,
...) G_GNUC_PRINTF (3, 4);
+GLIB_AVAILABLE_IN_ALL
gint g_vsnprintf (gchar *string,
gulong n,
gchar const *format,
- va_list args);
+ va_list args)
+ G_GNUC_PRINTF(3, 0);
+GLIB_AVAILABLE_IN_ALL
void g_nullify_pointer (gpointer *nullify_location);
typedef enum
@@ -253,13 +267,9 @@ int atexit (void (*)(void));
#endif /* G_DISABLE_DEPRECATED */
-#ifndef __GTK_DOC_IGNORE__
-#ifdef G_OS_WIN32
-#define g_find_program_in_path g_find_program_in_path_utf8
-#endif
-#endif
/* Look for an executable in PATH, following execvp() rules */
+GLIB_AVAILABLE_IN_ALL
gchar* g_find_program_in_path (const gchar *program);
/* Bit tests
@@ -321,8 +331,6 @@ g_bit_storage (gulong number)
}
#endif /* G_CAN_INLINE || __G_UTILS_C__ */
-G_END_DECLS
-
#ifndef G_DISABLE_DEPRECATED
/*
@@ -372,4 +380,6 @@ DllMain (HINSTANCE hinstDLL, \
#endif /* G_PLATFORM_WIN32 */
+G_END_DECLS
+
#endif /* __G_UTILS_H__ */
diff --git a/glib/glib/gvariant-core.c b/glib/glib/gvariant-core.c
index 1633463..dc20c32 100644
--- a/glib/glib/gvariant-core.c
+++ b/glib/glib/gvariant-core.c
@@ -18,6 +18,8 @@
* Boston, MA 02111-1307, USA.
*/
+#include "config.h"
+
#include <glib/gvariant-core.h>
#include <glib/gvariant-serialiser.h>
@@ -484,8 +486,7 @@ g_variant_alloc (const GVariantType *type,
return value;
}
-/* -- internal -- */
-/* < internal >
+/**
* g_variant_new_from_bytes:
* @type: a #GVariantType
* @bytes: a #GBytes
@@ -497,7 +498,9 @@ g_variant_alloc (const GVariantType *type,
*
* A reference is taken on @bytes.
*
- * Returns: a new #GVariant with a floating reference
+ * Returns: (transfer none): a new #GVariant with a floating reference
+ *
+ * Since: 2.36
*/
GVariant *
g_variant_new_from_bytes (const GVariantType *type,
@@ -535,6 +538,8 @@ g_variant_new_from_bytes (const GVariantType *type,
return value;
}
+/* -- internal -- */
+
/* < internal >
* g_variant_new_from_children:
* @type: a #GVariantType
@@ -862,6 +867,43 @@ g_variant_get_data (GVariant *value)
}
/**
+ * g_variant_get_data_as_bytes:
+ * @value: a #GVariant
+ *
+ * Returns a pointer to the serialised form of a #GVariant instance.
+ * The semantics of this function are exactly the same as
+ * g_variant_get_data(), except that the returned #GBytes holds
+ * a reference to the variant data.
+ *
+ * Returns: (transfer full): A new #GBytes representing the variant data
+ *
+ * Since: 2.36
+ */
+GBytes *
+g_variant_get_data_as_bytes (GVariant *value)
+{
+ const gchar *bytes_data;
+ const gchar *data;
+ gsize bytes_size;
+ gsize size;
+
+ g_variant_lock (value);
+ g_variant_ensure_serialised (value);
+ g_variant_unlock (value);
+
+ bytes_data = g_bytes_get_data (value->contents.serialised.bytes, &bytes_size);
+ data = value->contents.serialised.data;
+ size = value->size;
+
+ if (data == bytes_data && size == bytes_size)
+ return g_bytes_ref (value->contents.serialised.bytes);
+ else
+ return g_bytes_new_from_bytes (value->contents.serialised.bytes,
+ data - bytes_data, size);
+}
+
+
+/**
* g_variant_n_children:
* @value: a container #GVariant
*
diff --git a/glib/glib/gvariant-core.h b/glib/glib/gvariant-core.h
index 1fd4829..d5a653d 100644
--- a/glib/glib/gvariant-core.h
+++ b/glib/glib/gvariant-core.h
@@ -26,21 +26,14 @@
#include <glib/gbytes.h>
/* gvariant-core.c */
-G_GNUC_INTERNAL
-GVariant * g_variant_new_from_bytes (const GVariantType *type,
- GBytes *bytes,
- gboolean trusted);
-G_GNUC_INTERNAL
GVariant * g_variant_new_from_children (const GVariantType *type,
GVariant **children,
gsize n_children,
gboolean trusted);
-G_GNUC_INTERNAL
gboolean g_variant_is_trusted (GVariant *value);
-G_GNUC_INTERNAL
GVariantTypeInfo * g_variant_get_type_info (GVariant *value);
#endif /* __G_VARIANT_CORE_H__ */
diff --git a/glib/glib/gvariant-internal.h b/glib/glib/gvariant-internal.h
index 66a080a..7d7eb99 100644
--- a/glib/glib/gvariant-internal.h
+++ b/glib/glib/gvariant-internal.h
@@ -28,9 +28,8 @@
#ifndef __G_VARIANT_INTERNAL_H__
#define __G_VARIANT_INTERNAL_H__
-#ifndef GLIB_COMPILATION
-#define GLIB_COMPILATION
-#endif
+/* Hack */
+#define __GLIB_H_INSIDE__
#include <glib/gvarianttype.h>
#include <glib/gtypes.h>
@@ -38,10 +37,14 @@
#include "gvariant-serialiser.h"
#include "gvarianttypeinfo.h"
+#undef __GLIB_H_INSIDE__
+
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_format_string_scan (const gchar *string,
const gchar *limit,
const gchar **endptr);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_format_string_scan_type (const gchar *string,
const gchar *limit,
const gchar **endptr);
diff --git a/glib/glib/gvariant-parser.c b/glib/glib/gvariant-parser.c
index 0d1b093..dc655ce 100644
--- a/glib/glib/gvariant-parser.c
+++ b/glib/glib/gvariant-parser.c
@@ -33,6 +33,7 @@
#include "gvariant.h"
#include "gvarianttype.h"
#include "gslice.h"
+#include "gthread.h"
/*
* two-pass algorithm
@@ -70,22 +71,14 @@
*
* Error codes returned by parsing text-format GVariants.
**/
-GQuark
-g_variant_parser_get_error_quark (void)
-{
- static GQuark the_quark;
-
- if (the_quark == 0)
- the_quark = g_quark_from_static_string ("g-variant-parse-error-quark");
-
- return the_quark;
-}
+G_DEFINE_QUARK (g-variant-parse-error-quark, g_variant_parser_get_error)
typedef struct
{
gint start, end;
} SourceRef;
+G_GNUC_PRINTF(5, 0)
static void
parser_set_error_va (GError **error,
SourceRef *location,
@@ -113,6 +106,7 @@ parser_set_error_va (GError **error,
g_string_free (msg, TRUE);
}
+G_GNUC_PRINTF(5, 6)
static void
parser_set_error (GError **error,
SourceRef *location,
@@ -138,6 +132,7 @@ typedef struct
} TokenStream;
+G_GNUC_PRINTF(5, 6)
static void
token_stream_set_error (TokenStream *stream,
GError **error,
@@ -228,10 +223,11 @@ token_stream_prepare (TokenStream *stream)
case '@': case '%':
/* stop at the first space, comma, colon or unmatched bracket.
* deals nicely with cases like (%i, %i) or {%i: %i}.
+ * Also: ] and > are never in format strings.
*/
for (end = stream->stream + 1;
end != stream->end && *end != ',' &&
- *end != ':' && *end != '>' && !g_ascii_isspace (*end);
+ *end != ':' && *end != '>' && *end != ']' && !g_ascii_isspace (*end);
end++)
if (*end == '(' || *end == '{')
@@ -336,7 +332,7 @@ token_stream_require (TokenStream *stream,
{
token_stream_set_error (stream, error, FALSE,
G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN,
- "expected `%s'%s", token, purpose);
+ "expected '%s'%s", token, purpose);
return FALSE;
}
@@ -533,6 +529,7 @@ ast_free (AST *ast)
ast->class->free (ast);
}
+G_GNUC_PRINTF(5, 6)
static void
ast_set_error (AST *ast,
GError **error,
@@ -561,7 +558,7 @@ ast_type_error (AST *ast,
typestr = g_variant_type_dup_string (type);
ast_set_error (ast, error, NULL,
G_VARIANT_PARSE_ERROR_TYPE_ERROR,
- "can not parse as value of type `%s'",
+ "can not parse as value of type '%s'",
typestr);
g_free (typestr);
@@ -947,7 +944,7 @@ array_parse (TokenStream *stream,
if (need_comma &&
!token_stream_require (stream, ",",
- " or `]' to follow array element",
+ " or ']' to follow array element",
error))
goto error;
@@ -1086,7 +1083,7 @@ tuple_parse (TokenStream *stream,
if (need_comma &&
!token_stream_require (stream, ",",
- " or `)' to follow tuple element",
+ " or ')' to follow tuple element",
error))
goto error;
@@ -1146,7 +1143,9 @@ variant_get_value (AST *ast,
Variant *variant = (Variant *) ast;
GVariant *child;
- g_assert (g_variant_type_equal (type, G_VARIANT_TYPE_VARIANT));
+ if (!g_variant_type_equal (type, G_VARIANT_TYPE_VARIANT))
+ return ast_type_error (ast, type, error);
+
child = ast_resolve (variant->value, error);
if (child == NULL)
@@ -1387,7 +1386,7 @@ dictionary_parse (TokenStream *stream,
only_one = token_stream_consume (stream, ",");
if (!only_one &&
!token_stream_require (stream, ":",
- " or `,' to follow dictionary entry key",
+ " or ',' to follow dictionary entry key",
error))
goto error;
@@ -1413,7 +1412,7 @@ dictionary_parse (TokenStream *stream,
AST *child;
if (!token_stream_require (stream, ",",
- " or `}' to follow dictionary entry", error))
+ " or '}' to follow dictionary entry", error))
goto error;
child = parse (stream, app, error);
@@ -1660,7 +1659,8 @@ bytestring_get_value (AST *ast,
{
ByteString *string = (ByteString *) ast;
- g_assert (g_variant_type_equal (type, G_VARIANT_TYPE_BYTESTRING));
+ if (!g_variant_type_equal (type, G_VARIANT_TYPE_BYTESTRING))
+ return ast_type_error (ast, type, error);
return g_variant_new_bytestring (string->string);
}
@@ -1793,7 +1793,7 @@ number_overflow (AST *ast,
{
ast_set_error (ast, error, NULL,
G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE,
- "number out of range for type `%c'",
+ "number out of range for type '%c'",
g_variant_type_peek_string (type)[0]);
return NULL;
}
@@ -2311,7 +2311,6 @@ parse (TokenStream *stream,
* @limit: (allow-none): a pointer to the end of @text, or %NULL
* @endptr: (allow-none): a location to store the end pointer, or %NULL
* @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL
- * @Returns: a reference to a #GVariant, or %NULL
*
* Parses a #GVariant from a text representation.
*
@@ -2343,6 +2342,8 @@ parse (TokenStream *stream,
*
* Officially, the language understood by the parser is "any string
* produced by g_variant_print()".
+ *
+ * Returns: a reference to a #GVariant, or %NULL
**/
GVariant *
g_variant_parse (const GVariantType *type,
diff --git a/glib/glib/gvariant-serialiser.c b/glib/glib/gvariant-serialiser.c
index 4ee6c72..cc5cc7b 100644
--- a/glib/glib/gvariant-serialiser.c
+++ b/glib/glib/gvariant-serialiser.c
@@ -1023,6 +1023,10 @@ gvs_tuple_is_normal (GVariantSerialised value)
gsize offset;
gsize i;
+ /* as per the comment in gvs_tuple_get_child() */
+ if G_UNLIKELY (value.data == NULL && value.size != 0)
+ return FALSE;
+
offset_size = gvs_get_offset_size (value.size);
length = g_variant_type_info_n_members (value.type_info);
offset_ptr = value.size;
diff --git a/glib/glib/gvariant-serialiser.h b/glib/glib/gvariant-serialiser.h
index f26b118..b003aed 100644
--- a/glib/glib/gvariant-serialiser.h
+++ b/glib/glib/gvariant-serialiser.h
@@ -33,7 +33,9 @@ typedef struct
} GVariantSerialised;
/* deserialisation */
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_serialised_n_children (GVariantSerialised container);
+GLIB_AVAILABLE_IN_ALL
GVariantSerialised g_variant_serialised_get_child (GVariantSerialised container,
gsize index);
@@ -41,25 +43,32 @@ GVariantSerialised g_variant_serialised_get_child (GVarian
typedef void (*GVariantSerialisedFiller) (GVariantSerialised *serialised,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_serialiser_needed_size (GVariantTypeInfo *info,
GVariantSerialisedFiller gsv_filler,
const gpointer *children,
gsize n_children);
+GLIB_AVAILABLE_IN_ALL
void g_variant_serialiser_serialise (GVariantSerialised container,
GVariantSerialisedFiller gsv_filler,
const gpointer *children,
gsize n_children);
/* misc */
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_serialised_is_normal (GVariantSerialised value);
+GLIB_AVAILABLE_IN_ALL
void g_variant_serialised_byteswap (GVariantSerialised value);
/* validation of strings */
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_serialiser_is_string (gconstpointer data,
gsize size);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_serialiser_is_object_path (gconstpointer data,
gsize size);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_serialiser_is_signature (gconstpointer data,
gsize size);
diff --git a/glib/glib/gvariant.c b/glib/glib/gvariant.c
index 5f2337c..3b3f7df 100644
--- a/glib/glib/gvariant.c
+++ b/glib/glib/gvariant.c
@@ -1160,13 +1160,13 @@ g_variant_get_fixed_array (GVariant *value,
{
if (array_element_size)
g_critical ("g_variant_get_fixed_array: assertion "
- "`g_variant_array_has_fixed_size (value, element_size)' "
+ "'g_variant_array_has_fixed_size (value, element_size)' "
"failed: array size %"G_GSIZE_FORMAT" does not match "
"given element_size %"G_GSIZE_FORMAT".",
array_element_size, element_size);
else
g_critical ("g_variant_get_fixed_array: assertion "
- "`g_variant_array_has_fixed_size (value, element_size)' "
+ "'g_variant_array_has_fixed_size (value, element_size)' "
"failed: array does not have fixed size.");
}
@@ -1274,6 +1274,80 @@ g_variant_new_string (const gchar *string)
}
/**
+ * g_variant_new_take_string: (skip)
+ * @string: a normal utf8 nul-terminated string
+ *
+ * Creates a string #GVariant with the contents of @string.
+ *
+ * @string must be valid utf8.
+ *
+ * This function consumes @string. g_free() will be called on @string
+ * when it is no longer required.
+ *
+ * You must not modify or access @string in any other way after passing
+ * it to this function. It is even possible that @string is immediately
+ * freed.
+ *
+ * Returns: (transfer none): a floating reference to a new string
+ * #GVariant instance
+ *
+ * Since: 2.38
+ **/
+GVariant *
+g_variant_new_take_string (gchar *string)
+{
+ GVariant *value;
+ GBytes *bytes;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (g_utf8_validate (string, -1, NULL), NULL);
+
+ bytes = g_bytes_new_take (string, strlen (string) + 1);
+ value = g_variant_new_from_bytes (G_VARIANT_TYPE_STRING, bytes, TRUE);
+ g_bytes_unref (bytes);
+
+ return value;
+}
+
+/**
+ * g_variant_new_printf: (skip)
+ * @format_string: a printf-style format string
+ * @...: arguments for @format_string
+ *
+ * Creates a string-type GVariant using printf formatting.
+ *
+ * This is similar to calling g_strdup_printf() and then
+ * g_variant_new_string() but it saves a temporary variable and an
+ * unnecessary copy.
+ *
+ * Returns: (transfer none): a floating reference to a new string
+ * #GVariant instance
+ *
+ * Since: 2.38
+ **/
+GVariant *
+g_variant_new_printf (const gchar *format_string,
+ ...)
+{
+ GVariant *value;
+ GBytes *bytes;
+ gchar *string;
+ va_list ap;
+
+ g_return_val_if_fail (format_string != NULL, NULL);
+
+ va_start (ap, format_string);
+ string = g_strdup_vprintf (format_string, ap);
+ va_end (ap);
+
+ bytes = g_bytes_new_take (string, strlen (string) + 1);
+ value = g_variant_new_from_bytes (G_VARIANT_TYPE_STRING, bytes, TRUE);
+ g_bytes_unref (bytes);
+
+ return value;
+}
+
+/**
* g_variant_new_object_path:
* @object_path: a normal C nul-terminated string
*
@@ -3741,6 +3815,110 @@ g_variant_format_string_scan (const gchar *string,
return TRUE;
}
+/**
+ * g_variant_check_format_string:
+ * @value: a #GVariant
+ * @format_string: a valid #GVariant format string
+ * @copy_only: %TRUE to ensure the format string makes deep copies
+ *
+ * Checks if calling g_variant_get() with @format_string on @value would
+ * be valid from a type-compatibility standpoint. @format_string is
+ * assumed to be a valid format string (from a syntactic standpoint).
+ *
+ * If @copy_only is %TRUE then this function additionally checks that it
+ * would be safe to call g_variant_unref() on @value immediately after
+ * the call to g_variant_get() without invalidating the result. This is
+ * only possible if deep copies are made (ie: there are no pointers to
+ * the data inside of the soon-to-be-freed #GVariant instance). If this
+ * check fails then a g_critical() is printed and %FALSE is returned.
+ *
+ * This function is meant to be used by functions that wish to provide
+ * varargs accessors to #GVariant values of uncertain values (eg:
+ * g_variant_lookup() or g_menu_model_get_item_attribute()).
+ *
+ * Returns: %TRUE if @format_string is safe to use
+ *
+ * Since: 2.34
+ */
+gboolean
+g_variant_check_format_string (GVariant *value,
+ const gchar *format_string,
+ gboolean copy_only)
+{
+ const gchar *original_format = format_string;
+ const gchar *type_string;
+
+ /* Interesting factoid: assuming a format string is valid, it can be
+ * converted to a type string by removing all '@' '&' and '^'
+ * characters.
+ *
+ * Instead of doing that, we can just skip those characters when
+ * comparing it to the type string of @value.
+ *
+ * For the copy-only case we can just drop the '&' from the list of
+ * characters to skip over. A '&' will never appear in a type string
+ * so we know that it won't be possible to return %TRUE if it is in a
+ * format string.
+ */
+ type_string = g_variant_get_type_string (value);
+
+ while (*type_string || *format_string)
+ {
+ gchar format = *format_string++;
+
+ switch (format)
+ {
+ case '&':
+ if G_UNLIKELY (copy_only)
+ {
+ /* for the love of all that is good, please don't mark this string for translation... */
+ g_critical ("g_variant_check_format_string() is being called by a function with a GVariant varargs "
+ "interface to validate the passed format string for type safety. The passed format "
+ "(%s) contains a '&' character which would result in a pointer being returned to the "
+ "data inside of a GVariant instance that may no longer exist by the time the function "
+ "returns. Modify your code to use a format string without '&'.", original_format);
+ return FALSE;
+ }
+
+ /* fall through */
+ case '^':
+ case '@':
+ /* ignore these 2 (or 3) */
+ continue;
+
+ case '?':
+ /* attempt to consume one of 'bynqiuxthdsog' */
+ {
+ char s = *type_string++;
+
+ if (s == '\0' || strchr ("bynqiuxthdsog", s) == NULL)
+ return FALSE;
+ }
+ continue;
+
+ case 'r':
+ /* ensure it's a tuple */
+ if (*type_string != '(')
+ return FALSE;
+
+ /* fall through */
+ case '*':
+ /* consume a full type string for the '*' or 'r' */
+ if (!g_variant_type_string_scan (type_string, NULL, &type_string))
+ return FALSE;
+
+ continue;
+
+ default:
+ /* attempt to consume exactly one character equal to the format */
+ if (format != *type_string++)
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
/*< private >
* g_variant_format_string_scan_type:
* @string: a string that may be prefixed with a format string
@@ -3803,10 +3981,10 @@ valid_format_string (const gchar *format_string,
if G_UNLIKELY (type == NULL || (single && *endptr != '\0'))
{
if (single)
- g_critical ("`%s' is not a valid GVariant format string",
+ g_critical ("'%s' is not a valid GVariant format string",
format_string);
else
- g_critical ("`%s' does not have a valid GVariant format "
+ g_critical ("'%s' does not have a valid GVariant format "
"string as a prefix", format_string);
if (type != NULL)
@@ -3823,11 +4001,13 @@ valid_format_string (const gchar *format_string,
fragment = g_strndup (format_string, endptr - format_string);
typestr = g_variant_type_dup_string (type);
- g_critical ("the GVariant format string `%s' has a type of "
- "`%s' but the given value has a type of `%s'",
+ g_critical ("the GVariant format string '%s' has a type of "
+ "'%s' but the given value has a type of '%s'",
fragment, typestr, g_variant_get_type_string (value));
g_variant_type_free (type);
+ g_free (fragment);
+ g_free (typestr);
return FALSE;
}
@@ -3977,14 +4157,14 @@ g_variant_valist_new_nnp (const gchar **str,
if G_UNLIKELY (!g_variant_type_is_array (type))
g_error ("g_variant_new: expected array GVariantBuilder but "
- "the built value has type `%s'",
+ "the built value has type '%s'",
g_variant_get_type_string (value));
type = g_variant_type_element (type);
if G_UNLIKELY (!g_variant_type_is_subtype_of (type, (GVariantType *) *str))
g_error ("g_variant_new: expected GVariantBuilder array element "
- "type `%s' but the built value has element type `%s'",
+ "type '%s' but the built value has element type '%s'",
g_variant_type_dup_string ((GVariantType *) *str),
g_variant_get_type_string (value) + 1);
@@ -4048,8 +4228,8 @@ g_variant_valist_new_nnp (const gchar **str,
case '@':
if G_UNLIKELY (!g_variant_is_of_type (ptr, (GVariantType *) *str))
- g_error ("g_variant_new: expected GVariant of type `%s' but "
- "received value has type `%s'",
+ g_error ("g_variant_new: expected GVariant of type '%s' but "
+ "received value has type '%s'",
g_variant_type_dup_string ((GVariantType *) *str),
g_variant_get_type_string (ptr));
@@ -4062,16 +4242,16 @@ g_variant_valist_new_nnp (const gchar **str,
case '?':
if G_UNLIKELY (!g_variant_type_is_basic (g_variant_get_type (ptr)))
- g_error ("g_variant_new: format string `?' expects basic-typed "
- "GVariant, but received value has type `%s'",
+ g_error ("g_variant_new: format string '?' expects basic-typed "
+ "GVariant, but received value has type '%s'",
g_variant_get_type_string (ptr));
return ptr;
case 'r':
if G_UNLIKELY (!g_variant_type_is_tuple (g_variant_get_type (ptr)))
- g_error ("g_variant_new: format string `r` expects tuple-typed "
- "GVariant, but received value has type `%s'",
+ g_error ("g_variant_new: format string 'r' expects tuple-typed "
+ "GVariant, but received value has type '%s'",
g_variant_get_type_string (ptr));
return ptr;
diff --git a/glib/glib/gvariant.h b/glib/glib/gvariant.h
index d0cd857..dbace86 100644
--- a/glib/glib/gvariant.h
+++ b/glib/glib/gvariant.h
@@ -20,15 +20,16 @@
* Author: Ryan Lortie <desrt@desrt.ca>
*/
+#ifndef __G_VARIANT_H__
+#define __G_VARIANT_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_VARIANT_H__
-#define __G_VARIANT_H__
-
#include <glib/gvarianttype.h>
#include <glib/gstring.h>
+#include <glib/gbytes.h>
G_BEGIN_DECLS
@@ -56,125 +57,209 @@ typedef enum
G_VARIANT_CLASS_DICT_ENTRY = '{'
} GVariantClass;
+GLIB_AVAILABLE_IN_ALL
void g_variant_unref (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_ref (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_ref_sink (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_floating (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_take_ref (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_get_type (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_variant_get_type_string (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_of_type (GVariant *value,
const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_container (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariantClass g_variant_classify (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_boolean (gboolean value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_byte (guchar value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_int16 (gint16 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_uint16 (guint16 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_int32 (gint32 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_uint32 (guint32 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_int64 (gint64 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_uint64 (guint64 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_handle (gint32 value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_double (gdouble value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_string (const gchar *string);
+GLIB_AVAILABLE_IN_2_38
+GVariant * g_variant_new_take_string (gchar *string);
+GLIB_AVAILABLE_IN_2_38
+GVariant * g_variant_new_printf (const gchar *format_string,
+ ...) G_GNUC_PRINTF (1, 2);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_object_path (const gchar *object_path);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_object_path (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_signature (const gchar *signature);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_signature (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_variant (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_strv (const gchar * const *strv,
gssize length);
GLIB_AVAILABLE_IN_2_30
GVariant * g_variant_new_objv (const gchar * const *strv,
gssize length);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_bytestring (const gchar *string);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_bytestring_array (const gchar * const *strv,
gssize length);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_fixed_array (const GVariantType *element_type,
gconstpointer elements,
gsize n_elements,
gsize element_size);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_get_boolean (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
guchar g_variant_get_byte (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gint16 g_variant_get_int16 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
guint16 g_variant_get_uint16 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gint32 g_variant_get_int32 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
guint32 g_variant_get_uint32 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gint64 g_variant_get_int64 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
guint64 g_variant_get_uint64 (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gint32 g_variant_get_handle (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gdouble g_variant_get_double (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_get_variant (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_variant_get_string (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
gchar * g_variant_dup_string (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
const gchar ** g_variant_get_strv (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_variant_dup_strv (GVariant *value,
gsize *length);
GLIB_AVAILABLE_IN_2_30
const gchar ** g_variant_get_objv (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_variant_dup_objv (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_variant_get_bytestring (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gchar * g_variant_dup_bytestring (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
const gchar ** g_variant_get_bytestring_array (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
gchar ** g_variant_dup_bytestring_array (GVariant *value,
gsize *length);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_maybe (const GVariantType *child_type,
GVariant *child);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_array (const GVariantType *child_type,
GVariant * const *children,
gsize n_children);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_tuple (GVariant * const *children,
gsize n_children);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_dict_entry (GVariant *key,
GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_get_maybe (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_n_children (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
void g_variant_get_child (GVariant *value,
gsize index_,
const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_get_child_value (GVariant *value,
gsize index_);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_lookup (GVariant *dictionary,
const gchar *key,
const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_lookup_value (GVariant *dictionary,
const gchar *key,
const GVariantType *expected_type);
+GLIB_AVAILABLE_IN_ALL
gconstpointer g_variant_get_fixed_array (GVariant *value,
gsize *n_elements,
gsize element_size);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_get_size (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gconstpointer g_variant_get_data (GVariant *value);
+GLIB_AVAILABLE_IN_2_36
+GBytes * g_variant_get_data_as_bytes (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
void g_variant_store (GVariant *value,
gpointer data);
+GLIB_AVAILABLE_IN_ALL
gchar * g_variant_print (GVariant *value,
gboolean type_annotate);
+GLIB_AVAILABLE_IN_ALL
GString * g_variant_print_string (GVariant *value,
GString *string,
gboolean type_annotate);
+GLIB_AVAILABLE_IN_ALL
guint g_variant_hash (gconstpointer value);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_equal (gconstpointer one,
gconstpointer two);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_get_normal_form (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_is_normal_form (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_byteswap (GVariant *value);
+
+GLIB_AVAILABLE_IN_2_36
+GVariant * g_variant_new_from_bytes (const GVariantType *type,
+ GBytes *bytes,
+ gboolean trusted);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_from_data (const GVariantType *type,
gconstpointer data,
gsize size,
@@ -188,16 +273,24 @@ struct _GVariantIter {
gsize x[16];
};
+GLIB_AVAILABLE_IN_ALL
GVariantIter * g_variant_iter_new (GVariant *value);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_iter_init (GVariantIter *iter,
GVariant *value);
+GLIB_AVAILABLE_IN_ALL
GVariantIter * g_variant_iter_copy (GVariantIter *iter);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_iter_n_children (GVariantIter *iter);
+GLIB_AVAILABLE_IN_ALL
void g_variant_iter_free (GVariantIter *iter);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_iter_next_value (GVariantIter *iter);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_iter_next (GVariantIter *iter,
const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_iter_loop (GVariantIter *iter,
const gchar *format_string,
...);
@@ -232,51 +325,74 @@ typedef enum
} GVariantParseError;
#define G_VARIANT_PARSE_ERROR (g_variant_parser_get_error_quark ())
+GLIB_AVAILABLE_IN_ALL
GQuark g_variant_parser_get_error_quark (void);
+GLIB_AVAILABLE_IN_ALL
GVariantBuilder * g_variant_builder_new (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_unref (GVariantBuilder *builder);
+GLIB_AVAILABLE_IN_ALL
GVariantBuilder * g_variant_builder_ref (GVariantBuilder *builder);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_init (GVariantBuilder *builder,
const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_builder_end (GVariantBuilder *builder);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_clear (GVariantBuilder *builder);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_open (GVariantBuilder *builder,
const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_close (GVariantBuilder *builder);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_add_value (GVariantBuilder *builder,
GVariant *value);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_add (GVariantBuilder *builder,
const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
void g_variant_builder_add_parsed (GVariantBuilder *builder,
const gchar *format,
...);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new (const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
void g_variant_get (GVariant *value,
const gchar *format_string,
...);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_va (const gchar *format_string,
const gchar **endptr,
va_list *app);
+GLIB_AVAILABLE_IN_ALL
void g_variant_get_va (GVariant *value,
const gchar *format_string,
const gchar **endptr,
va_list *app);
+GLIB_AVAILABLE_IN_2_34
+gboolean g_variant_check_format_string (GVariant *value,
+ const gchar *format_string,
+ gboolean copy_only);
-
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_parse (const GVariantType *type,
const gchar *text,
const gchar *limit,
const gchar **endptr,
GError **error);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_parsed (const gchar *format,
...);
+GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_parsed_va (const gchar *format,
va_list *app);
+GLIB_AVAILABLE_IN_ALL
gint g_variant_compare (gconstpointer one,
gconstpointer two);
G_END_DECLS
diff --git a/glib/glib/gvarianttype.c b/glib/glib/gvarianttype.c
index 5c27fe0..658af77 100644
--- a/glib/glib/gvarianttype.c
+++ b/glib/glib/gvarianttype.c
@@ -486,14 +486,11 @@
static gboolean
g_variant_type_check (const GVariantType *type)
{
- const gchar *type_string;
-
if (type == NULL)
return FALSE;
- type_string = (const gchar *) type;
-#ifndef G_DISABLE_CHECKS
- return g_variant_type_string_scan (type_string, NULL, NULL);
+#if 0
+ return g_variant_type_string_scan ((const gchar *) type, NULL, NULL);
#else
return TRUE;
#endif
@@ -1418,7 +1415,7 @@ g_variant_type_new_tuple (const GVariantType * const *items,
}
/**
- * g_variant_type_new_array:
+ * g_variant_type_new_array: (constructor)
* @element: a #GVariantType
*
* Constructs the type corresponding to an array of elements of the
@@ -1448,7 +1445,7 @@ g_variant_type_new_array (const GVariantType *element)
}
/**
- * g_variant_type_new_maybe:
+ * g_variant_type_new_maybe: (constructor)
* @element: a #GVariantType
*
* Constructs the type corresponding to a maybe instance containing
@@ -1478,7 +1475,7 @@ g_variant_type_new_maybe (const GVariantType *element)
}
/**
- * g_variant_type_new_dict_entry:
+ * g_variant_type_new_dict_entry: (constructor)
* @key: a basic #GVariantType
* @value: a #GVariantType
*
diff --git a/glib/glib/gvarianttype.h b/glib/glib/gvarianttype.h
index fe1ba84..81e324f 100644
--- a/glib/glib/gvarianttype.h
+++ b/glib/glib/gvarianttype.h
@@ -20,13 +20,13 @@
* Author: Ryan Lortie <desrt@desrt.ca>
*/
+#ifndef __G_VARIANT_TYPE_H__
+#define __G_VARIANT_TYPE_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_VARIANT_TYPE_H__
-#define __G_VARIANT_TYPE_H__
-
#include <glib/gmessages.h>
#include <glib/gtypes.h>
@@ -294,57 +294,87 @@ typedef struct _GVariantType GVariantType;
#endif
/* type string checking */
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_string_is_valid (const gchar *type_string);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_string_scan (const gchar *string,
const gchar *limit,
const gchar **endptr);
/* create/destroy */
+GLIB_AVAILABLE_IN_ALL
void g_variant_type_free (GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_copy (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_new (const gchar *type_string);
/* getters */
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_type_get_string_length (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
const gchar * g_variant_type_peek_string (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gchar * g_variant_type_dup_string (const GVariantType *type);
/* classification */
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_definite (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_container (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_basic (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_maybe (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_array (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_tuple (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_dict_entry (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_variant (const GVariantType *type);
/* for hash tables */
+GLIB_AVAILABLE_IN_ALL
guint g_variant_type_hash (gconstpointer type);
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_equal (gconstpointer type1,
gconstpointer type2);
/* subtypes */
+GLIB_AVAILABLE_IN_ALL
gboolean g_variant_type_is_subtype_of (const GVariantType *type,
const GVariantType *supertype);
/* type iterator interface */
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_element (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_first (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_next (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_type_n_items (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_key (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_value (const GVariantType *type);
/* constructors */
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_new_array (const GVariantType *element);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_new_maybe (const GVariantType *element);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_new_tuple (const GVariantType * const *items,
gint length);
+GLIB_AVAILABLE_IN_ALL
GVariantType * g_variant_type_new_dict_entry (const GVariantType *key,
const GVariantType *value);
/*< private >*/
+GLIB_AVAILABLE_IN_ALL
const GVariantType * g_variant_type_checked_ (const gchar *);
G_END_DECLS
diff --git a/glib/glib/gvarianttypeinfo.h b/glib/glib/gvarianttypeinfo.h
index aaf14f4..7247bf2 100644
--- a/glib/glib/gvarianttypeinfo.h
+++ b/glib/glib/gvarianttypeinfo.h
@@ -125,27 +125,37 @@ typedef struct
#define G_VARIANT_MEMBER_ENDING_OFFSET 2
/* query */
+GLIB_AVAILABLE_IN_ALL
const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *typeinfo);
+GLIB_AVAILABLE_IN_ALL
void g_variant_type_info_query (GVariantTypeInfo *typeinfo,
guint *alignment,
gsize *size);
/* array */
+GLIB_AVAILABLE_IN_ALL
GVariantTypeInfo * g_variant_type_info_element (GVariantTypeInfo *typeinfo);
+GLIB_AVAILABLE_IN_ALL
void g_variant_type_info_query_element (GVariantTypeInfo *typeinfo,
guint *alignment,
gsize *size);
/* structure */
+GLIB_AVAILABLE_IN_ALL
gsize g_variant_type_info_n_members (GVariantTypeInfo *typeinfo);
+GLIB_AVAILABLE_IN_ALL
const GVariantMemberInfo * g_variant_type_info_member_info (GVariantTypeInfo *typeinfo,
gsize index);
/* new/ref/unref */
+GLIB_AVAILABLE_IN_ALL
GVariantTypeInfo * g_variant_type_info_get (const GVariantType *type);
+GLIB_AVAILABLE_IN_ALL
GVariantTypeInfo * g_variant_type_info_ref (GVariantTypeInfo *typeinfo);
+GLIB_AVAILABLE_IN_ALL
void g_variant_type_info_unref (GVariantTypeInfo *typeinfo);
+GLIB_AVAILABLE_IN_ALL
void g_variant_type_info_assert_no_infos (void);
#endif /* __G_VARIANT_TYPE_INFO_H__ */
diff --git a/glib/glib/gversion.h b/glib/glib/gversion.h
index d0581c2..7eb414d 100644
--- a/glib/glib/gversion.h
+++ b/glib/glib/gversion.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_VERSION_H__
+#define __G_VERSION_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_VERSION_H__
-#define __G_VERSION_H__
-
#include <glib/gtypes.h>
G_BEGIN_DECLS
@@ -41,6 +41,7 @@ GLIB_VAR const guint glib_micro_version;
GLIB_VAR const guint glib_interface_age;
GLIB_VAR const guint glib_binary_age;
+GLIB_AVAILABLE_IN_ALL
const gchar * glib_check_version (guint required_major,
guint required_minor,
guint required_micro);
diff --git a/glib/glib/gversionmacros.h b/glib/glib/gversionmacros.h
index 95b0e7f..b591534 100644
--- a/glib/glib/gversionmacros.h
+++ b/glib/glib/gversionmacros.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_VERSION_MACROS_H__
+#define __G_VERSION_MACROS_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_VERSION_MACROS_H__
-#define __G_VERSION_MACROS_H__
-
/* Version boundaries checks */
#define G_ENCODE_VERSION(major,minor) ((major) << 16 | (minor) << 8)
@@ -77,6 +77,36 @@
*/
#define GLIB_VERSION_2_32 (G_ENCODE_VERSION (2, 32))
+/**
+ * GLIB_VERSION_2_34:
+ *
+ * A macro that evaluates to the 2.34 version of GLib, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.34
+ */
+#define GLIB_VERSION_2_34 (G_ENCODE_VERSION (2, 34))
+
+/**
+ * GLIB_VERSION_2_36:
+ *
+ * A macro that evaluates to the 2.36 version of GLib, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.36
+ */
+#define GLIB_VERSION_2_36 (G_ENCODE_VERSION (2, 36))
+
+/**
+ * GLIB_VERSION_2_38:
+ *
+ * A macro that evaluates to the 2.38 version of GLib, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.38
+ */
+#define GLIB_VERSION_2_38 (G_ENCODE_VERSION (2, 38))
+
/* evaluates to the current stable version; for development cycles,
* this means the next stable target
*/
@@ -101,16 +131,25 @@
* The definition should be one of the predefined GLib version
* macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
*
- * This macro defines the lower bound for the GLib API to use.
+ * This macro defines the earliest version of GLib that the package is
+ * required to be able to compile against.
*
- * If a function has been deprecated in a newer version of GLib,
- * it is possible to use this symbol to avoid the compiler warnings
- * without disabling warning for every deprecated function.
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions that were deprecated in version
+ * %GLIB_VERSION_MIN_REQUIRED or earlier will cause warnings (but
+ * using functions deprecated in later releases will not).
*
* Since: 2.32
*/
+/* If the package sets GLIB_VERSION_MIN_REQUIRED to some future
+ * GLIB_VERSION_X_Y value that we don't know about, it will compare as
+ * 0 in preprocessor tests.
+ */
#ifndef GLIB_VERSION_MIN_REQUIRED
-# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_PREV_STABLE)
+# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE)
+#elif GLIB_VERSION_MIN_REQUIRED == 0
+# undef GLIB_VERSION_MIN_REQUIRED
+# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE + 2)
#endif
/**
@@ -121,23 +160,28 @@
* The definition should be one of the predefined GLib version
* macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
*
- * This macro defines the upper bound for the GLib API to use.
+ * This macro defines the latest version of the GLib API that the
+ * package is allowed to make use of.
+ *
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions added after version
+ * %GLIB_VERSION_MAX_ALLOWED will cause warnings.
*
- * If a function has been introduced in a newer version of GLib,
- * it is possible to use this symbol to get compiler warnings when
- * trying to use that function.
+ * Unless you are using GLIB_CHECK_VERSION() or the like to compile
+ * different code depending on the GLib version, then this should be
+ * set to the same value as %GLIB_VERSION_MIN_REQUIRED.
*
* Since: 2.32
*/
-#ifndef GLIB_VERSION_MAX_ALLOWED
-# if GLIB_VERSION_MIN_REQUIRED > GLIB_VERSION_PREV_STABLE
-# define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_MIN_REQUIRED
-# else
-# define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_CUR_STABLE
-# endif
+#if !defined (GLIB_VERSION_MAX_ALLOWED) || (GLIB_VERSION_MAX_ALLOWED == 0)
+# undef GLIB_VERSION_MAX_ALLOWED
+# define GLIB_VERSION_MAX_ALLOWED (GLIB_VERSION_CUR_STABLE)
#endif
/* sanity checks */
+#if GLIB_VERSION_MIN_REQUIRED > GLIB_VERSION_CUR_STABLE
+#error "GLIB_VERSION_MIN_REQUIRED must be <= GLIB_VERSION_CUR_STABLE"
+#endif
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_MIN_REQUIRED
#error "GLIB_VERSION_MAX_ALLOWED must be >= GLIB_VERSION_MIN_REQUIRED"
#endif
@@ -150,6 +194,7 @@
* do *not* use them in other projects. Instead, use G_DEPRECATED
* or define your own wrappers around it.
*/
+#define GLIB_AVAILABLE_IN_ALL _GLIB_EXTERN
/* XXX: Every new stable minor release should add a set of macros here */
@@ -157,56 +202,98 @@
# define GLIB_DEPRECATED_IN_2_26 GLIB_DEPRECATED
# define GLIB_DEPRECATED_IN_2_26_FOR(f) GLIB_DEPRECATED_FOR(f)
#else
-# define GLIB_DEPRECATED_IN_2_26
-# define GLIB_DEPRECATED_IN_2_26_FOR(f)
+# define GLIB_DEPRECATED_IN_2_26 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_26_FOR(f) _GLIB_EXTERN
#endif
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_26
# define GLIB_AVAILABLE_IN_2_26 GLIB_UNAVAILABLE(2, 26)
#else
-# define GLIB_AVAILABLE_IN_2_26
+# define GLIB_AVAILABLE_IN_2_26 _GLIB_EXTERN
#endif
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_28
# define GLIB_DEPRECATED_IN_2_28 GLIB_DEPRECATED
# define GLIB_DEPRECATED_IN_2_28_FOR(f) GLIB_DEPRECATED_FOR(f)
#else
-# define GLIB_DEPRECATED_IN_2_28
-# define GLIB_DEPRECATED_IN_2_28_FOR(f)
+# define GLIB_DEPRECATED_IN_2_28 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_28_FOR(f) _GLIB_EXTERN
#endif
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_28
# define GLIB_AVAILABLE_IN_2_28 GLIB_UNAVAILABLE(2, 28)
#else
-# define GLIB_AVAILABLE_IN_2_28
+# define GLIB_AVAILABLE_IN_2_28 _GLIB_EXTERN
#endif
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_30
# define GLIB_DEPRECATED_IN_2_30 GLIB_DEPRECATED
# define GLIB_DEPRECATED_IN_2_30_FOR(f) GLIB_DEPRECATED_FOR(f)
#else
-# define GLIB_DEPRECATED_IN_2_30
-# define GLIB_DEPRECATED_IN_2_30_FOR(f)
+# define GLIB_DEPRECATED_IN_2_30 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_30_FOR(f) _GLIB_EXTERN
#endif
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_30
# define GLIB_AVAILABLE_IN_2_30 GLIB_UNAVAILABLE(2, 30)
#else
-# define GLIB_AVAILABLE_IN_2_30
+# define GLIB_AVAILABLE_IN_2_30 _GLIB_EXTERN
#endif
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_32
# define GLIB_DEPRECATED_IN_2_32 GLIB_DEPRECATED
# define GLIB_DEPRECATED_IN_2_32_FOR(f) GLIB_DEPRECATED_FOR(f)
#else
-# define GLIB_DEPRECATED_IN_2_32
-# define GLIB_DEPRECATED_IN_2_32_FOR(f)
+# define GLIB_DEPRECATED_IN_2_32 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_32_FOR(f) _GLIB_EXTERN
#endif
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_32
# define GLIB_AVAILABLE_IN_2_32 GLIB_UNAVAILABLE(2, 32)
#else
-# define GLIB_AVAILABLE_IN_2_32
+# define GLIB_AVAILABLE_IN_2_32 _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_34
+# define GLIB_DEPRECATED_IN_2_34 GLIB_DEPRECATED
+# define GLIB_DEPRECATED_IN_2_34_FOR(f) GLIB_DEPRECATED_FOR(f)
+#else
+# define GLIB_DEPRECATED_IN_2_34 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_34_FOR(f) _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_34
+# define GLIB_AVAILABLE_IN_2_34 GLIB_UNAVAILABLE(2, 34)
+#else
+# define GLIB_AVAILABLE_IN_2_34 _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_36
+# define GLIB_DEPRECATED_IN_2_36 GLIB_DEPRECATED
+# define GLIB_DEPRECATED_IN_2_36_FOR(f) GLIB_DEPRECATED_FOR(f)
+#else
+# define GLIB_DEPRECATED_IN_2_36 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_36_FOR(f) _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_36
+# define GLIB_AVAILABLE_IN_2_36 GLIB_UNAVAILABLE(2, 36)
+#else
+# define GLIB_AVAILABLE_IN_2_36 _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_38
+# define GLIB_DEPRECATED_IN_2_38 GLIB_DEPRECATED
+# define GLIB_DEPRECATED_IN_2_38_FOR(f) GLIB_DEPRECATED_FOR(f)
+#else
+# define GLIB_DEPRECATED_IN_2_38 _GLIB_EXTERN
+# define GLIB_DEPRECATED_IN_2_38_FOR(f) _GLIB_EXTERN
+#endif
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+# define GLIB_AVAILABLE_IN_2_38 GLIB_UNAVAILABLE(2, 38)
+#else
+# define GLIB_AVAILABLE_IN_2_38 _GLIB_EXTERN
#endif
#endif /* __G_VERSION_MACROS_H__ */
diff --git a/glib/glib/gwakeup.c b/glib/glib/gwakeup.c
index bb49059..2aec2f5 100644
--- a/glib/glib/gwakeup.c
+++ b/glib/glib/gwakeup.c
@@ -22,7 +22,7 @@
#include "config.h"
-/* gwakeup.h is special -- GIO and some test cases include it. As such,
+/* gwakeup.c is special -- GIO and some test cases include it. As such,
* it cannot include other glib headers without triggering the single
* includes warnings. We have to manually include its dependencies here
* (and at all other use sites).
@@ -230,11 +230,20 @@ void
g_wakeup_signal (GWakeup *wakeup)
{
guint64 one = 1;
+ int res;
if (wakeup->fds[1] == -1)
- write (wakeup->fds[0], &one, sizeof one);
+ {
+ do
+ res = write (wakeup->fds[0], &one, sizeof one);
+ while (G_UNLIKELY (res == -1 && errno == EINTR));
+ }
else
- write (wakeup->fds[1], &one, 1);
+ {
+ do
+ res = write (wakeup->fds[1], &one, 1);
+ while (G_UNLIKELY (res == -1 && errno == EINTR));
+ }
}
/**
diff --git a/glib/glib/gwakeup.h b/glib/glib/gwakeup.h
index bd94520..d871cdf 100644
--- a/glib/glib/gwakeup.h
+++ b/glib/glib/gwakeup.h
@@ -26,12 +26,12 @@
typedef struct _GWakeup GWakeup;
-G_GNUC_INTERNAL GWakeup * g_wakeup_new (void);
-G_GNUC_INTERNAL void g_wakeup_free (GWakeup *wakeup);
+GWakeup * g_wakeup_new (void);
+void g_wakeup_free (GWakeup *wakeup);
-G_GNUC_INTERNAL void g_wakeup_get_pollfd (GWakeup *wakeup,
- GPollFD *poll_fd);
-G_GNUC_INTERNAL void g_wakeup_signal (GWakeup *wakeup);
-G_GNUC_INTERNAL void g_wakeup_acknowledge (GWakeup *wakeup);
+void g_wakeup_get_pollfd (GWakeup *wakeup,
+ GPollFD *poll_fd);
+void g_wakeup_signal (GWakeup *wakeup);
+void g_wakeup_acknowledge (GWakeup *wakeup);
#endif
diff --git a/glib/glib/gwin32.h b/glib/glib/gwin32.h
index b0fb7c0..ae87a45 100644
--- a/glib/glib/gwin32.h
+++ b/glib/glib/gwin32.h
@@ -24,13 +24,13 @@
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
+#ifndef __G_WIN32_H__
+#define __G_WIN32_H__
+
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
-#ifndef __G_WIN32_H__
-#define __G_WIN32_H__
-
#include <glib/gtypes.h>
#ifdef G_PLATFORM_WIN32
@@ -65,6 +65,7 @@ G_BEGIN_DECLS
* g_win32_. Or that was the idea at some time, but there is just one
* of those:
*/
+GLIB_AVAILABLE_IN_ALL
gint g_win32_ftruncate (gint f,
guint size);
#endif /* G_OS_WIN32 */
@@ -75,36 +76,34 @@ gint g_win32_ftruncate (gint f,
* 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().
*/
+GLIB_AVAILABLE_IN_ALL
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().
*/
+GLIB_AVAILABLE_IN_ALL
gchar* g_win32_error_message (gint error);
-#ifndef G_DISABLE_DEPRECATED
-
-#ifndef __GTK_DOC_IGNORE__
-#ifdef _WIN64
-#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
-#endif
-#endif
-
+#ifndef _WIN64
+GLIB_DEPRECATED
gchar* g_win32_get_package_installation_directory (const gchar *package,
const gchar *dll_name);
+GLIB_DEPRECATED
gchar* g_win32_get_package_installation_subdirectory (const gchar *package,
const gchar *dll_name,
const gchar *subdir);
-
#endif
+GLIB_AVAILABLE_IN_ALL
gchar* g_win32_get_package_installation_directory_of_module (gpointer hmodule);
+GLIB_AVAILABLE_IN_ALL
guint g_win32_get_windows_version (void);
+GLIB_AVAILABLE_IN_ALL
gchar* g_win32_locale_filename_from_utf8 (const gchar *utf8filename);
/* As of GLib 2.14 we only support NT-based Windows */
@@ -115,4 +114,20 @@ G_END_DECLS
#endif /* G_PLATFORM_WIN32 */
+#ifdef G_OS_WIN32
+#ifdef _WIN64
+#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
+#endif
+
+GLIB_AVAILABLE_IN_ALL
+gchar *g_win32_get_package_installation_directory_utf8 (const gchar *package,
+ const gchar *dll_name);
+GLIB_AVAILABLE_IN_ALL
+gchar *g_win32_get_package_installation_subdirectory_utf8 (const gchar *package,
+ const gchar *dll_name,
+ const gchar *subdir);
+
+#endif /* G_OS_WIN32 */
+
#endif /* __G_WIN32_H__ */
diff --git a/glib/glib/libcharset/Makefile.am b/glib/glib/libcharset/Makefile.am
index f45e498..abf32cb 100644
--- a/glib/glib/libcharset/Makefile.am
+++ b/glib/glib/libcharset/Makefile.am
@@ -1,11 +1,13 @@
## Process this file with automake to produce Makefile.in
-include $(top_srcdir)/Makefile.decl
+include $(top_srcdir)/glib.mk
-INCLUDES = \
- -DLIBDIR=\"$(libdir)\" $(config_h_INCLUDES)
+AM_CPPFLAGS = \
+ -DLIBDIR=\"$(libdir)\" \
+ $(config_h_INCLUDES)
-noinst_LTLIBRARIES = libcharset.la
+noinst_LTLIBRARIES += libcharset.la
+libcharset_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS)
libcharset_la_SOURCES = \
libcharset.h \
localcharset.h \
@@ -36,4 +38,4 @@ SUFFIXES = .sed .sin
$(AM_V_GEN) $(SED) -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@
@mv t-$@ $@
-CLEANFILES = charset.alias ref-add.sed ref-del.sed
+CLEANFILES += charset.alias ref-add.sed ref-del.sed
diff --git a/glib/glib/libcharset/config.charset b/glib/glib/libcharset/config.charset
index e8c258b..cb1d8f0 100755
--- a/glib/glib/libcharset/config.charset
+++ b/glib/glib/libcharset/config.charset
@@ -467,6 +467,38 @@ case "$os" in
# minimize the use of decomposed Unicode. Unfortunately, through the
# Darwin file system, decomposed UTF-8 strings are leaked into user
# space nevertheless.
+ #
+ # Even with those limitations, nl_langinfo does work often
+ # enough to be useful. Since setenv works only with locales
+ # provided in /usr/share/locale, the following aliases are the
+ # codesets used there.
+ echo "ARMSCII-8 ARMSCII-8"
+ echo "Big5HKSCS BIG5-HKSCS"
+ echo "Big5 BIG5"
+ echo "CP866 CP866"
+ echo "CP949 CP949"
+ echo "CP1131 CP1131"
+ echo "CP1251 CP1251"
+ echo "eucCN EUC-CN"
+ echo "eucKR EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucjp EUC-JP"
+ echo "GB18030 GB18030"
+ echo "GB2312 GB2312"
+ echo "GBK GBK"
+# echo "ISCII-DEV ISCII_DEV" Not supported by iconv
+ 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-9 ISO-8859-9"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "KOI8-R KOI8-R"
+ echo "KOI8-U KOI8-U"
+ echo "PT154 CP154"
+ echo "SJIS SHIFT_JIS"
echo "* UTF-8"
;;
beos*)
diff --git a/glib/glib/valgrind.h b/glib/glib/valgrind.h
new file mode 100644
index 0000000..cc2cf3d
--- /dev/null
+++ b/glib/glib/valgrind.h
@@ -0,0 +1,4840 @@
+/* -*- c -*-
+ ----------------------------------------------------------------
+
+ Notice that the following BSD-style license applies to this one
+ file (valgrind.h) only. The rest of Valgrind is licensed under the
+ terms of the GNU General Public License, version 2, unless
+ otherwise indicated. See the COPYING file in the source
+ distribution for details.
+
+ ----------------------------------------------------------------
+
+ This file is part of Valgrind, a dynamic binary instrumentation
+ framework.
+
+ Copyright (C) 2000-2012 Julian Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+ ----------------------------------------------------------------
+
+ Notice that the above BSD-style license applies to this one file
+ (valgrind.h) only. The entire rest of Valgrind is licensed under
+ the terms of the GNU General Public License, version 2. See the
+ COPYING file in the source distribution for details.
+
+ ----------------------------------------------------------------
+*/
+
+
+/* This file is for inclusion into client (your!) code.
+
+ You can use these macros to manipulate and query Valgrind's
+ execution inside your own programs.
+
+ The resulting executables will still run without Valgrind, just a
+ little bit more slowly than they otherwise would, but otherwise
+ unchanged. When not running on valgrind, each client request
+ consumes very few (eg. 7) instructions, so the resulting performance
+ loss is negligible unless you plan to execute client requests
+ millions of times per second. Nevertheless, if that is still a
+ problem, you can compile with the NVALGRIND symbol defined (gcc
+ -DNVALGRIND) so that client requests are not even compiled in. */
+
+#ifndef __VALGRIND_H
+#define __VALGRIND_H
+
+
+/* ------------------------------------------------------------------ */
+/* VERSION NUMBER OF VALGRIND */
+/* ------------------------------------------------------------------ */
+
+/* Specify Valgrind's version number, so that user code can
+ conditionally compile based on our version number. Note that these
+ were introduced at version 3.6 and so do not exist in version 3.5
+ or earlier. The recommended way to use them to check for "version
+ X.Y or later" is (eg)
+
+#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \
+ && (__VALGRIND_MAJOR__ > 3 \
+ || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
+*/
+#define __VALGRIND_MAJOR__ 3
+#define __VALGRIND_MINOR__ 8
+
+
+#include <stdarg.h>
+
+/* Nb: this file might be included in a file compiled with -ansi. So
+ we can't use C++ style "//" comments nor the "asm" keyword (instead
+ use "__asm__"). */
+
+/* Derive some tags indicating what the target platform is. Note
+ that in this file we're using the compiler's CPP symbols for
+ identifying architectures, which are different to the ones we use
+ within the rest of Valgrind. Note, __powerpc__ is active for both
+ 32 and 64-bit PPC, whereas __powerpc64__ is only active for the
+ latter (on Linux, that is).
+
+ Misc note: how to find out what's predefined in gcc by default:
+ gcc -Wp,-dM somefile.c
+*/
+#undef PLAT_x86_darwin
+#undef PLAT_amd64_darwin
+#undef PLAT_x86_win32
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_arm_linux
+#undef PLAT_s390x_linux
+#undef PLAT_mips32_linux
+
+
+#if defined(__APPLE__) && defined(__i386__)
+# define PLAT_x86_darwin 1
+#elif defined(__APPLE__) && defined(__x86_64__)
+# define PLAT_amd64_darwin 1
+#elif defined(__MINGW32__) || defined(__CYGWIN32__) \
+ || (defined(_WIN32) && defined(_M_IX86))
+# define PLAT_x86_win32 1
+#elif defined(__linux__) && defined(__i386__)
+# define PLAT_x86_linux 1
+#elif defined(__linux__) && defined(__x86_64__)
+# define PLAT_amd64_linux 1
+#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
+# define PLAT_ppc32_linux 1
+#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
+# define PLAT_ppc64_linux 1
+#elif defined(__linux__) && defined(__arm__)
+# define PLAT_arm_linux 1
+#elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
+# define PLAT_s390x_linux 1
+#elif defined(__linux__) && defined(__mips__)
+# define PLAT_mips32_linux 1
+#else
+/* If we're not compiling for our target platform, don't generate
+ any inline asms. */
+# if !defined(NVALGRIND)
+# define NVALGRIND 1
+# endif
+#endif
+
+
+/* ------------------------------------------------------------------ */
+/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */
+/* in here of use to end-users -- skip to the next section. */
+/* ------------------------------------------------------------------ */
+
+/*
+ * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client
+ * request. Accepts both pointers and integers as arguments.
+ *
+ * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind
+ * client request that does not return a value.
+
+ * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind
+ * client request and whose value equals the client request result. Accepts
+ * both pointers and integers as arguments. Note that such calls are not
+ * necessarily pure functions -- they may have side effects.
+ */
+
+#define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
+ _zzq_request, _zzq_arg1, _zzq_arg2, \
+ _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
+ (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
+ (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
+
+#define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \
+ _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
+ (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
+ (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
+
+#if defined(NVALGRIND)
+
+/* Define NVALGRIND to completely remove the Valgrind magic sequence
+ from the compiled code (analogous to NDEBUG's effects on
+ assert()) */
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ (_zzq_default)
+
+#else /* ! NVALGRIND */
+
+/* The following defines the magic code sequences which the JITter
+ spots and handles magically. Don't look too closely at them as
+ they will rot your brain.
+
+ The assembly code sequences for all architectures is in this one
+ file. This is because this file must be stand-alone, and we don't
+ want to have multiple files.
+
+ For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
+ value gets put in the return slot, so that everything works when
+ this is executed not under Valgrind. Args are passed in a memory
+ block, and so there's no intrinsic limit to the number that could
+ be passed, but it's currently five.
+
+ The macro args are:
+ _zzq_rlval result lvalue
+ _zzq_default default value (result returned when running on real CPU)
+ _zzq_request request code
+ _zzq_arg1..5 request params
+
+ The other two macros are used to support function wrapping, and are
+ a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the
+ guest's NRADDR pseudo-register and whatever other information is
+ needed to safely run the call original from the wrapper: on
+ ppc64-linux, the R2 value at the divert point is also needed. This
+ information is abstracted into a user-visible type, OrigFn.
+
+ VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
+ guest, but guarantees that the branch instruction will not be
+ redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
+ branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a
+ complete inline asm, since it needs to be combined with more magic
+ inline asm stuff to be useful.
+*/
+
+/* ------------------------- x86-{linux,darwin} ---------------- */
+
+#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
+ || (defined(PLAT_x86_win32) && defined(__GNUC__))
+
+typedef
+ struct {
+ unsigned int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "roll $3, %%edi ; roll $13, %%edi\n\t" \
+ "roll $29, %%edi ; roll $19, %%edi\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ __extension__ \
+ ({volatile unsigned int _zzq_args[6]; \
+ volatile unsigned int _zzq_result; \
+ _zzq_args[0] = (unsigned int)(_zzq_request); \
+ _zzq_args[1] = (unsigned int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned int)(_zzq_arg5); \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %EDX = client_request ( %EAX ) */ \
+ "xchgl %%ebx,%%ebx" \
+ : "=d" (_zzq_result) \
+ : "a" (&_zzq_args[0]), "0" (_zzq_default) \
+ : "cc", "memory" \
+ ); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ volatile unsigned int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %EAX = guest_NRADDR */ \
+ "xchgl %%ecx,%%ecx" \
+ : "=a" (__addr) \
+ : \
+ : "cc", "memory" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_CALL_NOREDIR_EAX \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* call-noredir *%EAX */ \
+ "xchgl %%edx,%%edx\n\t"
+#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
+
+/* ------------------------- x86-Win32 ------------------------- */
+
+#if defined(PLAT_x86_win32) && !defined(__GNUC__)
+
+typedef
+ struct {
+ unsigned int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#if defined(_MSC_VER)
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ __asm rol edi, 3 __asm rol edi, 13 \
+ __asm rol edi, 29 __asm rol edi, 19
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
+ (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
+ (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
+ (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
+
+static __inline uintptr_t
+valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
+ uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
+ uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
+ uintptr_t _zzq_arg5)
+{
+ volatile uintptr_t _zzq_args[6];
+ volatile unsigned int _zzq_result;
+ _zzq_args[0] = (uintptr_t)(_zzq_request);
+ _zzq_args[1] = (uintptr_t)(_zzq_arg1);
+ _zzq_args[2] = (uintptr_t)(_zzq_arg2);
+ _zzq_args[3] = (uintptr_t)(_zzq_arg3);
+ _zzq_args[4] = (uintptr_t)(_zzq_arg4);
+ _zzq_args[5] = (uintptr_t)(_zzq_arg5);
+ __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
+ __SPECIAL_INSTRUCTION_PREAMBLE
+ /* %EDX = client_request ( %EAX ) */
+ __asm xchg ebx,ebx
+ __asm mov _zzq_result, edx
+ }
+ return _zzq_result;
+}
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ volatile unsigned int __addr; \
+ __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %EAX = guest_NRADDR */ \
+ __asm xchg ecx,ecx \
+ __asm mov __addr, eax \
+ } \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_CALL_NOREDIR_EAX ERROR
+
+#else
+#error Unsupported compiler.
+#endif
+
+#endif /* PLAT_x86_win32 */
+
+/* ------------------------ amd64-{linux,darwin} --------------- */
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
+
+typedef
+ struct {
+ unsigned long long int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
+ "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ __extension__ \
+ ({ volatile unsigned long long int _zzq_args[6]; \
+ volatile unsigned long long int _zzq_result; \
+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \
+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %RDX = client_request ( %RAX ) */ \
+ "xchgq %%rbx,%%rbx" \
+ : "=d" (_zzq_result) \
+ : "a" (&_zzq_args[0]), "0" (_zzq_default) \
+ : "cc", "memory" \
+ ); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ volatile unsigned long long int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %RAX = guest_NRADDR */ \
+ "xchgq %%rcx,%%rcx" \
+ : "=a" (__addr) \
+ : \
+ : "cc", "memory" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_CALL_NOREDIR_RAX \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* call-noredir *%RAX */ \
+ "xchgq %%rdx,%%rdx\n\t"
+#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
+
+/* ------------------------ ppc32-linux ------------------------ */
+
+#if defined(PLAT_ppc32_linux)
+
+typedef
+ struct {
+ unsigned int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
+ "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ \
+ __extension__ \
+ ({ unsigned int _zzq_args[6]; \
+ unsigned int _zzq_result; \
+ unsigned int* _zzq_ptr; \
+ _zzq_args[0] = (unsigned int)(_zzq_request); \
+ _zzq_args[1] = (unsigned int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned int)(_zzq_arg5); \
+ _zzq_ptr = _zzq_args; \
+ __asm__ volatile("mr 3,%1\n\t" /*default*/ \
+ "mr 4,%2\n\t" /*ptr*/ \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 = client_request ( %R4 ) */ \
+ "or 1,1,1\n\t" \
+ "mr %0,3" /*result*/ \
+ : "=b" (_zzq_result) \
+ : "b" (_zzq_default), "b" (_zzq_ptr) \
+ : "cc", "memory", "r3", "r4"); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ unsigned int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 = guest_NRADDR */ \
+ "or 2,2,2\n\t" \
+ "mr %0,3" \
+ : "=b" (__addr) \
+ : \
+ : "cc", "memory", "r3" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir *%R11 */ \
+ "or 3,3,3\n\t"
+#endif /* PLAT_ppc32_linux */
+
+/* ------------------------ ppc64-linux ------------------------ */
+
+#if defined(PLAT_ppc64_linux)
+
+typedef
+ struct {
+ unsigned long long int nraddr; /* where's the code? */
+ unsigned long long int r2; /* what tocptr do we need? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
+ "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ \
+ __extension__ \
+ ({ unsigned long long int _zzq_args[6]; \
+ unsigned long long int _zzq_result; \
+ unsigned long long int* _zzq_ptr; \
+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \
+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
+ _zzq_ptr = _zzq_args; \
+ __asm__ volatile("mr 3,%1\n\t" /*default*/ \
+ "mr 4,%2\n\t" /*ptr*/ \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 = client_request ( %R4 ) */ \
+ "or 1,1,1\n\t" \
+ "mr %0,3" /*result*/ \
+ : "=b" (_zzq_result) \
+ : "b" (_zzq_default), "b" (_zzq_ptr) \
+ : "cc", "memory", "r3", "r4"); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ unsigned long long int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 = guest_NRADDR */ \
+ "or 2,2,2\n\t" \
+ "mr %0,3" \
+ : "=b" (__addr) \
+ : \
+ : "cc", "memory", "r3" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 = guest_NRADDR_GPR2 */ \
+ "or 4,4,4\n\t" \
+ "mr %0,3" \
+ : "=b" (__addr) \
+ : \
+ : "cc", "memory", "r3" \
+ ); \
+ _zzq_orig->r2 = __addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir *%R11 */ \
+ "or 3,3,3\n\t"
+
+#endif /* PLAT_ppc64_linux */
+
+/* ------------------------- arm-linux ------------------------- */
+
+#if defined(PLAT_arm_linux)
+
+typedef
+ struct {
+ unsigned int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
+ "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ \
+ __extension__ \
+ ({volatile unsigned int _zzq_args[6]; \
+ volatile unsigned int _zzq_result; \
+ _zzq_args[0] = (unsigned int)(_zzq_request); \
+ _zzq_args[1] = (unsigned int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned int)(_zzq_arg5); \
+ __asm__ volatile("mov r3, %1\n\t" /*default*/ \
+ "mov r4, %2\n\t" /*ptr*/ \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* R3 = client_request ( R4 ) */ \
+ "orr r10, r10, r10\n\t" \
+ "mov %0, r3" /*result*/ \
+ : "=r" (_zzq_result) \
+ : "r" (_zzq_default), "r" (&_zzq_args[0]) \
+ : "cc","memory", "r3", "r4"); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ unsigned int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* R3 = guest_NRADDR */ \
+ "orr r11, r11, r11\n\t" \
+ "mov %0, r3" \
+ : "=r" (__addr) \
+ : \
+ : "cc", "memory", "r3" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir *%R4 */ \
+ "orr r12, r12, r12\n\t"
+
+#endif /* PLAT_arm_linux */
+
+/* ------------------------ s390x-linux ------------------------ */
+
+#if defined(PLAT_s390x_linux)
+
+typedef
+ struct {
+ unsigned long long int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+/* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific
+ * code. This detection is implemented in platform specific toIR.c
+ * (e.g. VEX/priv/guest_s390_decoder.c).
+ */
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "lr 15,15\n\t" \
+ "lr 1,1\n\t" \
+ "lr 2,2\n\t" \
+ "lr 3,3\n\t"
+
+#define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
+#define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
+#define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ __extension__ \
+ ({volatile unsigned long long int _zzq_args[6]; \
+ volatile unsigned long long int _zzq_result; \
+ _zzq_args[0] = (unsigned long long int)(_zzq_request); \
+ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
+ __asm__ volatile(/* r2 = args */ \
+ "lgr 2,%1\n\t" \
+ /* r3 = default */ \
+ "lgr 3,%2\n\t" \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ __CLIENT_REQUEST_CODE \
+ /* results = r3 */ \
+ "lgr %0, 3\n\t" \
+ : "=d" (_zzq_result) \
+ : "a" (&_zzq_args[0]), "0" (_zzq_default) \
+ : "cc", "2", "3", "memory" \
+ ); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ volatile unsigned long long int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ __GET_NR_CONTEXT_CODE \
+ "lgr %0, 3\n\t" \
+ : "=a" (__addr) \
+ : \
+ : "cc", "3", "memory" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_CALL_NOREDIR_R1 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ __CALL_NO_REDIR_CODE
+
+#endif /* PLAT_s390x_linux */
+
+/* ------------------------- mips32-linux ---------------- */
+
+#if defined(PLAT_mips32_linux)
+
+typedef
+ struct {
+ unsigned int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+/* .word 0x342
+ * .word 0x742
+ * .word 0xC2
+ * .word 0x4C2*/
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "srl $0, $0, 13\n\t" \
+ "srl $0, $0, 29\n\t" \
+ "srl $0, $0, 3\n\t" \
+ "srl $0, $0, 19\n\t"
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ __extension__ \
+ ({ volatile unsigned int _zzq_args[6]; \
+ volatile unsigned int _zzq_result; \
+ _zzq_args[0] = (unsigned int)(_zzq_request); \
+ _zzq_args[1] = (unsigned int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned int)(_zzq_arg5); \
+ __asm__ volatile("move $11, %1\n\t" /*default*/ \
+ "move $12, %2\n\t" /*ptr*/ \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* T3 = client_request ( T4 ) */ \
+ "or $13, $13, $13\n\t" \
+ "move %0, $11\n\t" /*result*/ \
+ : "=r" (_zzq_result) \
+ : "r" (_zzq_default), "r" (&_zzq_args[0]) \
+ : "cc","memory", "t3", "t4"); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ volatile unsigned int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %t9 = guest_NRADDR */ \
+ "or $14, $14, $14\n\t" \
+ "move %0, $11" /*result*/ \
+ : "=r" (__addr) \
+ : \
+ : "cc", "memory" , "t3" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_CALL_NOREDIR_T9 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* call-noredir *%t9 */ \
+ "or $15, $15, $15\n\t"
+#endif /* PLAT_mips32_linux */
+
+/* Insert assembly code for other platforms here... */
+
+#endif /* NVALGRIND */
+
+
+/* ------------------------------------------------------------------ */
+/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */
+/* ugly. It's the least-worst tradeoff I can think of. */
+/* ------------------------------------------------------------------ */
+
+/* This section defines magic (a.k.a appalling-hack) macros for doing
+ guaranteed-no-redirection macros, so as to get from function
+ wrappers to the functions they are wrapping. The whole point is to
+ construct standard call sequences, but to do the call itself with a
+ special no-redirect call pseudo-instruction that the JIT
+ understands and handles specially. This section is long and
+ repetitious, and I can't see a way to make it shorter.
+
+ The naming scheme is as follows:
+
+ CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc}
+
+ 'W' stands for "word" and 'v' for "void". Hence there are
+ different macros for calling arity 0, 1, 2, 3, 4, etc, functions,
+ and for each, the possibility of returning a word-typed result, or
+ no result.
+*/
+
+/* Use these to write the name of your wrapper. NOTE: duplicates
+ VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts
+ the default behaviour equivalance class tag "0000" into the name.
+ See pub_tool_redir.h for details -- normally you don't need to
+ think about this, though. */
+
+/* Use an extra level of macroisation so as to ensure the soname/fnname
+ args are fully macro-expanded before pasting them together. */
+#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
+
+#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
+ VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
+
+#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
+ VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
+
+/* Use this macro from within a wrapper function to collect the
+ context (address and possibly other info) of the original function.
+ Once you have that you can then use it in one of the CALL_FN_
+ macros. The type of the argument _lval is OrigFn. */
+#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
+
+/* Also provide end-user facilities for function replacement, rather
+ than wrapping. A replacement function differs from a wrapper in
+ that it has no way to get hold of the original function being
+ called, and hence no way to call onwards to it. In a replacement
+ function, VALGRIND_GET_ORIG_FN always returns zero. */
+
+#define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \
+ VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
+
+#define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \
+ VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
+
+/* Derivatives of the main macros below, for calling functions
+ returning void. */
+
+#define CALL_FN_v_v(fnptr) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_v(_junk,fnptr); } while (0)
+
+#define CALL_FN_v_W(fnptr, arg1) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
+
+#define CALL_FN_v_WW(fnptr, arg1,arg2) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
+
+#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
+
+#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
+
+#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
+
+#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
+
+#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
+ do { volatile unsigned long _junk; \
+ CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
+
+/* ------------------------- x86-{linux,darwin} ---------------- */
+
+#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
+
+/* These regs are trashed by the hidden call. No need to mention eax
+ as gcc can already see that, plus causes gcc to bomb. */
+#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
+
+/* Macros to save and align the stack before making a function
+ call and restore it afterwards as gcc may not keep the stack
+ pointer aligned if it doesn't realise calls are being made
+ to other functions. */
+
+#define VALGRIND_ALIGN_STACK \
+ "movl %%esp,%%edi\n\t" \
+ "andl $0xfffffff0,%%esp\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "movl %%edi,%%esp\n\t"
+
+/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
+ long) == 4. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $12, %%esp\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $8, %%esp\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $4, %%esp\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $12, %%esp\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $8, %%esp\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $4, %%esp\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $12, %%esp\n\t" \
+ "pushl 36(%%eax)\n\t" \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $8, %%esp\n\t" \
+ "pushl 40(%%eax)\n\t" \
+ "pushl 36(%%eax)\n\t" \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "subl $4, %%esp\n\t" \
+ "pushl 44(%%eax)\n\t" \
+ "pushl 40(%%eax)\n\t" \
+ "pushl 36(%%eax)\n\t" \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ _argvec[12] = (unsigned long)(arg12); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "pushl 48(%%eax)\n\t" \
+ "pushl 44(%%eax)\n\t" \
+ "pushl 40(%%eax)\n\t" \
+ "pushl 36(%%eax)\n\t" \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_x86_linux || PLAT_x86_darwin */
+
+/* ------------------------ amd64-{linux,darwin} --------------- */
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
+
+/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \
+ "rdi", "r8", "r9", "r10", "r11"
+
+/* This is all pretty complex. It's so as to make stack unwinding
+ work reliably. See bug 243270. The basic problem is the sub and
+ add of 128 of %rsp in all of the following macros. If gcc believes
+ the CFA is in %rsp, then unwinding may fail, because what's at the
+ CFA is not what gcc "expected" when it constructs the CFIs for the
+ places where the macros are instantiated.
+
+ But we can't just add a CFI annotation to increase the CFA offset
+ by 128, to match the sub of 128 from %rsp, because we don't know
+ whether gcc has chosen %rsp as the CFA at that point, or whether it
+ has chosen some other register (eg, %rbp). In the latter case,
+ adding a CFI annotation to change the CFA offset is simply wrong.
+
+ So the solution is to get hold of the CFA using
+ __builtin_dwarf_cfa(), put it in a known register, and add a
+ CFI annotation to say what the register is. We choose %rbp for
+ this (perhaps perversely), because:
+
+ (1) %rbp is already subject to unwinding. If a new register was
+ chosen then the unwinder would have to unwind it in all stack
+ traces, which is expensive, and
+
+ (2) %rbp is already subject to precise exception updates in the
+ JIT. If a new register was chosen, we'd have to have precise
+ exceptions for it too, which reduces performance of the
+ generated code.
+
+ However .. one extra complication. We can't just whack the result
+ of __builtin_dwarf_cfa() into %rbp and then add %rbp to the
+ list of trashed registers at the end of the inline assembly
+ fragments; gcc won't allow %rbp to appear in that list. Hence
+ instead we need to stash %rbp in %r15 for the duration of the asm,
+ and say that %r15 is trashed instead. gcc seems happy to go with
+ that.
+
+ Oh .. and this all needs to be conditionalised so that it is
+ unchanged from before this commit, when compiled with older gccs
+ that don't support __builtin_dwarf_cfa. Furthermore, since
+ this header file is freestanding, it has to be independent of
+ config.h, and so the following conditionalisation cannot depend on
+ configure time checks.
+
+ Although it's not clear from
+ 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)',
+ this expression excludes Darwin.
+ .cfi directives in Darwin assembly appear to be completely
+ different and I haven't investigated how they work.
+
+ For even more entertainment value, note we have to use the
+ completely undocumented __builtin_dwarf_cfa(), which appears to
+ really compute the CFA, whereas __builtin_frame_address(0) claims
+ to but actually doesn't. See
+ https://bugs.kde.org/show_bug.cgi?id=243270#c47
+*/
+#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
+# define __FRAME_POINTER \
+ ,"r"(__builtin_dwarf_cfa())
+# define VALGRIND_CFI_PROLOGUE \
+ "movq %%rbp, %%r15\n\t" \
+ "movq %2, %%rbp\n\t" \
+ ".cfi_remember_state\n\t" \
+ ".cfi_def_cfa rbp, 0\n\t"
+# define VALGRIND_CFI_EPILOGUE \
+ "movq %%r15, %%rbp\n\t" \
+ ".cfi_restore_state\n\t"
+#else
+# define __FRAME_POINTER
+# define VALGRIND_CFI_PROLOGUE
+# define VALGRIND_CFI_EPILOGUE
+#endif
+
+/* Macros to save and align the stack before making a function
+ call and restore it afterwards as gcc may not keep the stack
+ pointer aligned if it doesn't realise calls are being made
+ to other functions. */
+
+#define VALGRIND_ALIGN_STACK \
+ "movq %%rsp,%%r14\n\t" \
+ "andq $0xfffffffffffffff0,%%rsp\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "movq %%r14,%%rsp\n\t"
+
+/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
+ long) == 8. */
+
+/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_
+ macros. In order not to trash the stack redzone, we need to drop
+ %rsp by 128 before the hidden call, and restore afterwards. The
+ nastyness is that it is only by luck that the stack still appears
+ to be unwindable during the hidden call - since then the behaviour
+ of any routine using this macro does not match what the CFI data
+ says. Sigh.
+
+ Why is this important? Imagine that a wrapper has a stack
+ allocated local, and passes to the hidden call, a pointer to it.
+ Because gcc does not know about the hidden call, it may allocate
+ that local in the redzone. Unfortunately the hidden call may then
+ trash it before it comes to use it. So we must step clear of the
+ redzone, for the duration of the hidden call, to make it safe.
+
+ Probably the same problem afflicts the other redzone-style ABIs too
+ (ppc64-linux); but for those, the stack is
+ self describing (none of this CFI nonsense) so at least messing
+ with the stack pointer doesn't give a danger of non-unwindable
+ stack. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $136,%%rsp\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $136,%%rsp\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $136,%%rsp\n\t" \
+ "pushq 88(%%rax)\n\t" \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ _argvec[12] = (unsigned long)(arg12); \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ VALGRIND_ALIGN_STACK \
+ "subq $128,%%rsp\n\t" \
+ "pushq 96(%%rax)\n\t" \
+ "pushq 88(%%rax)\n\t" \
+ "pushq 80(%%rax)\n\t" \
+ "pushq 72(%%rax)\n\t" \
+ "pushq 64(%%rax)\n\t" \
+ "pushq 56(%%rax)\n\t" \
+ "movq 48(%%rax), %%r9\n\t" \
+ "movq 40(%%rax), %%r8\n\t" \
+ "movq 32(%%rax), %%rcx\n\t" \
+ "movq 24(%%rax), %%rdx\n\t" \
+ "movq 16(%%rax), %%rsi\n\t" \
+ "movq 8(%%rax), %%rdi\n\t" \
+ "movq (%%rax), %%rax\n\t" /* target->%rax */ \
+ VALGRIND_CALL_NOREDIR_RAX \
+ VALGRIND_RESTORE_STACK \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=a" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
+
+/* ------------------------ ppc32-linux ------------------------ */
+
+#if defined(PLAT_ppc32_linux)
+
+/* This is useful for finding out about the on-stack stuff:
+
+ extern int f9 ( int,int,int,int,int,int,int,int,int );
+ extern int f10 ( int,int,int,int,int,int,int,int,int,int );
+ extern int f11 ( int,int,int,int,int,int,int,int,int,int,int );
+ extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int );
+
+ int g9 ( void ) {
+ return f9(11,22,33,44,55,66,77,88,99);
+ }
+ int g10 ( void ) {
+ return f10(11,22,33,44,55,66,77,88,99,110);
+ }
+ int g11 ( void ) {
+ return f11(11,22,33,44,55,66,77,88,99,110,121);
+ }
+ int g12 ( void ) {
+ return f12(11,22,33,44,55,66,77,88,99,110,121,132);
+ }
+*/
+
+/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS \
+ "lr", "ctr", "xer", \
+ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
+ "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
+ "r11", "r12", "r13"
+
+/* Macros to save and align the stack before making a function
+ call and restore it afterwards as gcc may not keep the stack
+ pointer aligned if it doesn't realise calls are being made
+ to other functions. */
+
+#define VALGRIND_ALIGN_STACK \
+ "mr 28,1\n\t" \
+ "rlwinm 1,1,0,0,27\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "mr 1,28\n\t"
+
+/* These CALL_FN_ macros assume that on ppc32-linux,
+ sizeof(unsigned long) == 4. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 10,32(11)\n\t" /* arg8->r10 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "addi 1,1,-16\n\t" \
+ /* arg9 */ \
+ "lwz 3,36(11)\n\t" \
+ "stw 3,8(1)\n\t" \
+ /* args1-8 */ \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 10,32(11)\n\t" /* arg8->r10 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "addi 1,1,-16\n\t" \
+ /* arg10 */ \
+ "lwz 3,40(11)\n\t" \
+ "stw 3,12(1)\n\t" \
+ /* arg9 */ \
+ "lwz 3,36(11)\n\t" \
+ "stw 3,8(1)\n\t" \
+ /* args1-8 */ \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 10,32(11)\n\t" /* arg8->r10 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ _argvec[11] = (unsigned long)arg11; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "addi 1,1,-32\n\t" \
+ /* arg11 */ \
+ "lwz 3,44(11)\n\t" \
+ "stw 3,16(1)\n\t" \
+ /* arg10 */ \
+ "lwz 3,40(11)\n\t" \
+ "stw 3,12(1)\n\t" \
+ /* arg9 */ \
+ "lwz 3,36(11)\n\t" \
+ "stw 3,8(1)\n\t" \
+ /* args1-8 */ \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 10,32(11)\n\t" /* arg8->r10 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ _argvec[11] = (unsigned long)arg11; \
+ _argvec[12] = (unsigned long)arg12; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "addi 1,1,-32\n\t" \
+ /* arg12 */ \
+ "lwz 3,48(11)\n\t" \
+ "stw 3,20(1)\n\t" \
+ /* arg11 */ \
+ "lwz 3,44(11)\n\t" \
+ "stw 3,16(1)\n\t" \
+ /* arg10 */ \
+ "lwz 3,40(11)\n\t" \
+ "stw 3,12(1)\n\t" \
+ /* arg9 */ \
+ "lwz 3,36(11)\n\t" \
+ "stw 3,8(1)\n\t" \
+ /* args1-8 */ \
+ "lwz 3,4(11)\n\t" /* arg1->r3 */ \
+ "lwz 4,8(11)\n\t" \
+ "lwz 5,12(11)\n\t" \
+ "lwz 6,16(11)\n\t" /* arg4->r6 */ \
+ "lwz 7,20(11)\n\t" \
+ "lwz 8,24(11)\n\t" \
+ "lwz 9,28(11)\n\t" \
+ "lwz 10,32(11)\n\t" /* arg8->r10 */ \
+ "lwz 11,0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ VALGRIND_RESTORE_STACK \
+ "mr %0,3" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_ppc32_linux */
+
+/* ------------------------ ppc64-linux ------------------------ */
+
+#if defined(PLAT_ppc64_linux)
+
+/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS \
+ "lr", "ctr", "xer", \
+ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
+ "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
+ "r11", "r12", "r13"
+
+/* Macros to save and align the stack before making a function
+ call and restore it afterwards as gcc may not keep the stack
+ pointer aligned if it doesn't realise calls are being made
+ to other functions. */
+
+#define VALGRIND_ALIGN_STACK \
+ "mr 28,1\n\t" \
+ "rldicr 1,1,0,59\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "mr 1,28\n\t"
+
+/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned
+ long) == 8. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+0]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+1]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+2]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+3]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+4]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+5]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+6]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+7]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+8]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ _argvec[2+8] = (unsigned long)arg8; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 10, 64(11)\n\t" /* arg8->r10 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+9]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ _argvec[2+8] = (unsigned long)arg8; \
+ _argvec[2+9] = (unsigned long)arg9; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "addi 1,1,-128\n\t" /* expand stack frame */ \
+ /* arg9 */ \
+ "ld 3,72(11)\n\t" \
+ "std 3,112(1)\n\t" \
+ /* args1-8 */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 10, 64(11)\n\t" /* arg8->r10 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+10]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ _argvec[2+8] = (unsigned long)arg8; \
+ _argvec[2+9] = (unsigned long)arg9; \
+ _argvec[2+10] = (unsigned long)arg10; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "addi 1,1,-128\n\t" /* expand stack frame */ \
+ /* arg10 */ \
+ "ld 3,80(11)\n\t" \
+ "std 3,120(1)\n\t" \
+ /* arg9 */ \
+ "ld 3,72(11)\n\t" \
+ "std 3,112(1)\n\t" \
+ /* args1-8 */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 10, 64(11)\n\t" /* arg8->r10 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+11]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ _argvec[2+8] = (unsigned long)arg8; \
+ _argvec[2+9] = (unsigned long)arg9; \
+ _argvec[2+10] = (unsigned long)arg10; \
+ _argvec[2+11] = (unsigned long)arg11; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "addi 1,1,-144\n\t" /* expand stack frame */ \
+ /* arg11 */ \
+ "ld 3,88(11)\n\t" \
+ "std 3,128(1)\n\t" \
+ /* arg10 */ \
+ "ld 3,80(11)\n\t" \
+ "std 3,120(1)\n\t" \
+ /* arg9 */ \
+ "ld 3,72(11)\n\t" \
+ "std 3,112(1)\n\t" \
+ /* args1-8 */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 10, 64(11)\n\t" /* arg8->r10 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3+12]; \
+ volatile unsigned long _res; \
+ /* _argvec[0] holds current r2 across the call */ \
+ _argvec[1] = (unsigned long)_orig.r2; \
+ _argvec[2] = (unsigned long)_orig.nraddr; \
+ _argvec[2+1] = (unsigned long)arg1; \
+ _argvec[2+2] = (unsigned long)arg2; \
+ _argvec[2+3] = (unsigned long)arg3; \
+ _argvec[2+4] = (unsigned long)arg4; \
+ _argvec[2+5] = (unsigned long)arg5; \
+ _argvec[2+6] = (unsigned long)arg6; \
+ _argvec[2+7] = (unsigned long)arg7; \
+ _argvec[2+8] = (unsigned long)arg8; \
+ _argvec[2+9] = (unsigned long)arg9; \
+ _argvec[2+10] = (unsigned long)arg10; \
+ _argvec[2+11] = (unsigned long)arg11; \
+ _argvec[2+12] = (unsigned long)arg12; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "mr 11,%1\n\t" \
+ "std 2,-16(11)\n\t" /* save tocptr */ \
+ "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \
+ "addi 1,1,-144\n\t" /* expand stack frame */ \
+ /* arg12 */ \
+ "ld 3,96(11)\n\t" \
+ "std 3,136(1)\n\t" \
+ /* arg11 */ \
+ "ld 3,88(11)\n\t" \
+ "std 3,128(1)\n\t" \
+ /* arg10 */ \
+ "ld 3,80(11)\n\t" \
+ "std 3,120(1)\n\t" \
+ /* arg9 */ \
+ "ld 3,72(11)\n\t" \
+ "std 3,112(1)\n\t" \
+ /* args1-8 */ \
+ "ld 3, 8(11)\n\t" /* arg1->r3 */ \
+ "ld 4, 16(11)\n\t" /* arg2->r4 */ \
+ "ld 5, 24(11)\n\t" /* arg3->r5 */ \
+ "ld 6, 32(11)\n\t" /* arg4->r6 */ \
+ "ld 7, 40(11)\n\t" /* arg5->r7 */ \
+ "ld 8, 48(11)\n\t" /* arg6->r8 */ \
+ "ld 9, 56(11)\n\t" /* arg7->r9 */ \
+ "ld 10, 64(11)\n\t" /* arg8->r10 */ \
+ "ld 11, 0(11)\n\t" /* target->r11 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ "mr 11,%1\n\t" \
+ "mr %0,3\n\t" \
+ "ld 2,-16(11)\n\t" /* restore tocptr */ \
+ VALGRIND_RESTORE_STACK \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "r" (&_argvec[2]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_ppc64_linux */
+
+/* ------------------------- arm-linux ------------------------- */
+
+#if defined(PLAT_arm_linux)
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
+
+/* Macros to save and align the stack before making a function
+ call and restore it afterwards as gcc may not keep the stack
+ pointer aligned if it doesn't realise calls are being made
+ to other functions. */
+
+/* This is a bit tricky. We store the original stack pointer in r10
+ as it is callee-saves. gcc doesn't allow the use of r11 for some
+ reason. Also, we can't directly "bic" the stack pointer in thumb
+ mode since r13 isn't an allowed register number in that context.
+ So use r4 as a temporary, since that is about to get trashed
+ anyway, just after each use of this macro. Side effect is we need
+ to be very careful about any future changes, since
+ VALGRIND_ALIGN_STACK simply assumes r4 is usable. */
+#define VALGRIND_ALIGN_STACK \
+ "mov r10, sp\n\t" \
+ "mov r4, sp\n\t" \
+ "bic r4, r4, #7\n\t" \
+ "mov sp, r4\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "mov sp, r10\n\t"
+
+/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned
+ long) == 4. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "sub sp, sp, #4 \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "push {r0} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "push {r0, r1} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "sub sp, sp, #4 \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "push {r0, r1, r2} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "ldr r3, [%1, #32] \n\t" \
+ "push {r0, r1, r2, r3} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "sub sp, sp, #4 \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "ldr r3, [%1, #32] \n\t" \
+ "ldr r4, [%1, #36] \n\t" \
+ "push {r0, r1, r2, r3, r4} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #40] \n\t" \
+ "push {r0} \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "ldr r3, [%1, #32] \n\t" \
+ "ldr r4, [%1, #36] \n\t" \
+ "push {r0, r1, r2, r3, r4} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "sub sp, sp, #4 \n\t" \
+ "ldr r0, [%1, #40] \n\t" \
+ "ldr r1, [%1, #44] \n\t" \
+ "push {r0, r1} \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "ldr r3, [%1, #32] \n\t" \
+ "ldr r4, [%1, #36] \n\t" \
+ "push {r0, r1, r2, r3, r4} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ _argvec[12] = (unsigned long)(arg12); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ldr r0, [%1, #40] \n\t" \
+ "ldr r1, [%1, #44] \n\t" \
+ "ldr r2, [%1, #48] \n\t" \
+ "push {r0, r1, r2} \n\t" \
+ "ldr r0, [%1, #20] \n\t" \
+ "ldr r1, [%1, #24] \n\t" \
+ "ldr r2, [%1, #28] \n\t" \
+ "ldr r3, [%1, #32] \n\t" \
+ "ldr r4, [%1, #36] \n\t" \
+ "push {r0, r1, r2, r3, r4} \n\t" \
+ "ldr r0, [%1, #4] \n\t" \
+ "ldr r1, [%1, #8] \n\t" \
+ "ldr r2, [%1, #12] \n\t" \
+ "ldr r3, [%1, #16] \n\t" \
+ "ldr r4, [%1] \n\t" /* target->r4 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
+ VALGRIND_RESTORE_STACK \
+ "mov %0, r0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_arm_linux */
+
+/* ------------------------- s390x-linux ------------------------- */
+
+#if defined(PLAT_s390x_linux)
+
+/* Similar workaround as amd64 (see above), but we use r11 as frame
+ pointer and save the old r11 in r7. r11 might be used for
+ argvec, therefore we copy argvec in r1 since r1 is clobbered
+ after the call anyway. */
+#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
+# define __FRAME_POINTER \
+ ,"d"(__builtin_dwarf_cfa())
+# define VALGRIND_CFI_PROLOGUE \
+ ".cfi_remember_state\n\t" \
+ "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \
+ "lgr 7,11\n\t" \
+ "lgr 11,%2\n\t" \
+ ".cfi_def_cfa r11, 0\n\t"
+# define VALGRIND_CFI_EPILOGUE \
+ "lgr 11, 7\n\t" \
+ ".cfi_restore_state\n\t"
+#else
+# define __FRAME_POINTER
+# define VALGRIND_CFI_PROLOGUE \
+ "lgr 1,%1\n\t"
+# define VALGRIND_CFI_EPILOGUE
+#endif
+
+/* Nb: On s390 the stack pointer is properly aligned *at all times*
+ according to the s390 GCC maintainer. (The ABI specification is not
+ precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and
+ VALGRIND_RESTORE_STACK are not defined here. */
+
+/* These regs are trashed by the hidden call. Note that we overwrite
+ r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
+ function a proper return address. All others are ABI defined call
+ clobbers. */
+#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
+ "f0","f1","f2","f3","f4","f5","f6","f7"
+
+/* Nb: Although r11 is modified in the asm snippets below (inside
+ VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
+ two reasons:
+ (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not
+ modified
+ (2) GCC will complain that r11 cannot appear inside a clobber section,
+ when compiled with -O -fno-omit-frame-pointer
+ */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 1, 0(1)\n\t" /* target->r1 */ \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "d" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+/* The call abi has the arguments in r2-r6 and stack */
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1, arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-160\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,160\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-168\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,168\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-176\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,176\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7 ,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-184\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "mvc 176(8,15), 64(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,184\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7 ,arg8, arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-192\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "mvc 176(8,15), 64(1)\n\t" \
+ "mvc 184(8,15), 72(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,192\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7 ,arg8, arg9, arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-200\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "mvc 176(8,15), 64(1)\n\t" \
+ "mvc 184(8,15), 72(1)\n\t" \
+ "mvc 192(8,15), 80(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,200\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7 ,arg8, arg9, arg10, arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ _argvec[11] = (unsigned long)arg11; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-208\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "mvc 176(8,15), 64(1)\n\t" \
+ "mvc 184(8,15), 72(1)\n\t" \
+ "mvc 192(8,15), 80(1)\n\t" \
+ "mvc 200(8,15), 88(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,208\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)arg1; \
+ _argvec[2] = (unsigned long)arg2; \
+ _argvec[3] = (unsigned long)arg3; \
+ _argvec[4] = (unsigned long)arg4; \
+ _argvec[5] = (unsigned long)arg5; \
+ _argvec[6] = (unsigned long)arg6; \
+ _argvec[7] = (unsigned long)arg7; \
+ _argvec[8] = (unsigned long)arg8; \
+ _argvec[9] = (unsigned long)arg9; \
+ _argvec[10] = (unsigned long)arg10; \
+ _argvec[11] = (unsigned long)arg11; \
+ _argvec[12] = (unsigned long)arg12; \
+ __asm__ volatile( \
+ VALGRIND_CFI_PROLOGUE \
+ "aghi 15,-216\n\t" \
+ "lg 2, 8(1)\n\t" \
+ "lg 3,16(1)\n\t" \
+ "lg 4,24(1)\n\t" \
+ "lg 5,32(1)\n\t" \
+ "lg 6,40(1)\n\t" \
+ "mvc 160(8,15), 48(1)\n\t" \
+ "mvc 168(8,15), 56(1)\n\t" \
+ "mvc 176(8,15), 64(1)\n\t" \
+ "mvc 184(8,15), 72(1)\n\t" \
+ "mvc 192(8,15), 80(1)\n\t" \
+ "mvc 200(8,15), 88(1)\n\t" \
+ "mvc 208(8,15), 96(1)\n\t" \
+ "lg 1, 0(1)\n\t" \
+ VALGRIND_CALL_NOREDIR_R1 \
+ "lgr %0, 2\n\t" \
+ "aghi 15,216\n\t" \
+ VALGRIND_CFI_EPILOGUE \
+ : /*out*/ "=d" (_res) \
+ : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+
+#endif /* PLAT_s390x_linux */
+
+/* ------------------------- mips-linux ------------------------- */
+
+#if defined(PLAT_mips32_linux)
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
+"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+"$25", "$31"
+
+/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned
+ long) == 4. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "subu $29, $29, 16 \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 16\n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $29, $29, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "subu $29, $29, 16 \n\t" \
+ "lw $a0, 4(%1) \n\t" /* arg1*/ \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 16 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $29, $29, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "subu $29, $29, 16 \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 16 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $29, $29, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "subu $29, $29, 16 \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 16 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $29, $29, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "subu $29, $29, 16 \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 16 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $29, $29, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 24\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $29, $29, 24 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 32\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "nop\n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 32 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 32\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 32 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 40\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 32(%1) \n\t" \
+ "sw $a0, 28($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 40 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 40\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 32(%1) \n\t" \
+ "sw $a0, 28($sp) \n\t" \
+ "lw $a0, 36(%1) \n\t" \
+ "sw $a0, 32($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 40 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 48\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 32(%1) \n\t" \
+ "sw $a0, 28($sp) \n\t" \
+ "lw $a0, 36(%1) \n\t" \
+ "sw $a0, 32($sp) \n\t" \
+ "lw $a0, 40(%1) \n\t" \
+ "sw $a0, 36($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 48 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 48\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 32(%1) \n\t" \
+ "sw $a0, 28($sp) \n\t" \
+ "lw $a0, 36(%1) \n\t" \
+ "sw $a0, 32($sp) \n\t" \
+ "lw $a0, 40(%1) \n\t" \
+ "sw $a0, 36($sp) \n\t" \
+ "lw $a0, 44(%1) \n\t" \
+ "sw $a0, 40($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 48 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11,arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ _argvec[12] = (unsigned long)(arg12); \
+ __asm__ volatile( \
+ "subu $29, $29, 8 \n\t" \
+ "sw $gp, 0($sp) \n\t" \
+ "sw $ra, 4($sp) \n\t" \
+ "lw $a0, 20(%1) \n\t" \
+ "subu $sp, $sp, 56\n\t" \
+ "sw $a0, 16($sp) \n\t" \
+ "lw $a0, 24(%1) \n\t" \
+ "sw $a0, 20($sp) \n\t" \
+ "lw $a0, 28(%1) \n\t" \
+ "sw $a0, 24($sp) \n\t" \
+ "lw $a0, 32(%1) \n\t" \
+ "sw $a0, 28($sp) \n\t" \
+ "lw $a0, 36(%1) \n\t" \
+ "sw $a0, 32($sp) \n\t" \
+ "lw $a0, 40(%1) \n\t" \
+ "sw $a0, 36($sp) \n\t" \
+ "lw $a0, 44(%1) \n\t" \
+ "sw $a0, 40($sp) \n\t" \
+ "lw $a0, 48(%1) \n\t" \
+ "sw $a0, 44($sp) \n\t" \
+ "lw $a0, 4(%1) \n\t" \
+ "lw $a1, 8(%1) \n\t" \
+ "lw $a2, 12(%1) \n\t" \
+ "lw $a3, 16(%1) \n\t" \
+ "lw $t9, 0(%1) \n\t" /* target->t9 */ \
+ VALGRIND_CALL_NOREDIR_T9 \
+ "addu $sp, $sp, 56 \n\t" \
+ "lw $gp, 0($sp) \n\t" \
+ "lw $ra, 4($sp) \n\t" \
+ "addu $sp, $sp, 8 \n\t" \
+ "move %0, $v0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_mips32_linux */
+
+
+/* ------------------------------------------------------------------ */
+/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */
+/* */
+/* ------------------------------------------------------------------ */
+
+/* Some request codes. There are many more of these, but most are not
+ exposed to end-user view. These are the public ones, all of the
+ form 0x1000 + small_number.
+
+ Core ones are in the range 0x00000000--0x0000ffff. The non-public
+ ones start at 0x2000.
+*/
+
+/* These macros are used by tools -- they must be public, but don't
+ embed them into other programs. */
+#define VG_USERREQ_TOOL_BASE(a,b) \
+ ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
+#define VG_IS_TOOL_USERREQ(a, b, v) \
+ (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
+
+/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
+ This enum comprises an ABI exported by Valgrind to programs
+ which use client requests. DO NOT CHANGE THE ORDER OF THESE
+ ENTRIES, NOR DELETE ANY -- add new ones at the end. */
+typedef
+ enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
+ VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
+
+ /* These allow any function to be called from the simulated
+ CPU but run on the real CPU. Nb: the first arg passed to
+ the function is always the ThreadId of the running
+ thread! So CLIENT_CALL0 actually requires a 1 arg
+ function, etc. */
+ VG_USERREQ__CLIENT_CALL0 = 0x1101,
+ VG_USERREQ__CLIENT_CALL1 = 0x1102,
+ VG_USERREQ__CLIENT_CALL2 = 0x1103,
+ VG_USERREQ__CLIENT_CALL3 = 0x1104,
+
+ /* Can be useful in regression testing suites -- eg. can
+ send Valgrind's output to /dev/null and still count
+ errors. */
+ VG_USERREQ__COUNT_ERRORS = 0x1201,
+
+ /* Allows a string (gdb monitor command) to be passed to the tool
+ Used for interaction with vgdb/gdb */
+ VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
+
+ /* These are useful and can be interpreted by any tool that
+ tracks malloc() et al, by using vg_replace_malloc.c. */
+ VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
+ VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
+ VG_USERREQ__FREELIKE_BLOCK = 0x1302,
+ /* Memory pool support. */
+ VG_USERREQ__CREATE_MEMPOOL = 0x1303,
+ VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
+ VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
+ VG_USERREQ__MEMPOOL_FREE = 0x1306,
+ VG_USERREQ__MEMPOOL_TRIM = 0x1307,
+ VG_USERREQ__MOVE_MEMPOOL = 0x1308,
+ VG_USERREQ__MEMPOOL_CHANGE = 0x1309,
+ VG_USERREQ__MEMPOOL_EXISTS = 0x130a,
+
+ /* Allow printfs to valgrind log. */
+ /* The first two pass the va_list argument by value, which
+ assumes it is the same size as or smaller than a UWord,
+ which generally isn't the case. Hence are deprecated.
+ The second two pass the vargs by reference and so are
+ immune to this problem. */
+ /* both :: char* fmt, va_list vargs (DEPRECATED) */
+ VG_USERREQ__PRINTF = 0x1401,
+ VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
+ /* both :: char* fmt, va_list* vargs */
+ VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
+ VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
+
+ /* Stack support. */
+ VG_USERREQ__STACK_REGISTER = 0x1501,
+ VG_USERREQ__STACK_DEREGISTER = 0x1502,
+ VG_USERREQ__STACK_CHANGE = 0x1503,
+
+ /* Wine support */
+ VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
+
+ /* Querying of debug info. */
+ VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
+
+ /* Disable/enable error reporting level. Takes a single
+ Word arg which is the delta to this thread's error
+ disablement indicator. Hence 1 disables or further
+ disables errors, and -1 moves back towards enablement.
+ Other values are not allowed. */
+ VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801
+ } Vg_ClientRequest;
+
+#if !defined(__GNUC__)
+# define __extension__ /* */
+#endif
+
+
+/* Returns the number of Valgrinds this code is running under. That
+ is, 0 if running natively, 1 if running under Valgrind, 2 if
+ running under Valgrind which is running under another Valgrind,
+ etc. */
+#define RUNNING_ON_VALGRIND \
+ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \
+ VG_USERREQ__RUNNING_ON_VALGRIND, \
+ 0, 0, 0, 0, 0) \
+
+
+/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
+ _qzz_len - 1]. Useful if you are debugging a JITter or some such,
+ since it provides a way to make sure valgrind will retranslate the
+ invalidated area. Returns no value. */
+#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \
+ _qzz_addr, _qzz_len, 0, 0, 0)
+
+
+/* These requests are for getting Valgrind itself to print something.
+ Possibly with a backtrace. This is a really ugly hack. The return value
+ is the number of characters printed, excluding the "**<pid>** " part at the
+ start and the backtrace (if present). */
+
+#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
+/* Modern GCC will optimize the static routine out if unused,
+ and unused attribute will shut down warnings about it. */
+static int VALGRIND_PRINTF(const char *format, ...)
+ __attribute__((format(__printf__, 1, 2), __unused__));
+#endif
+static int
+#if defined(_MSC_VER)
+__inline
+#endif
+VALGRIND_PRINTF(const char *format, ...)
+{
+#if defined(NVALGRIND)
+ return 0;
+#else /* NVALGRIND */
+#if defined(_MSC_VER)
+ uintptr_t _qzz_res;
+#else
+ unsigned long _qzz_res;
+#endif
+ va_list vargs;
+ va_start(vargs, format);
+#if defined(_MSC_VER)
+ _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
+ VG_USERREQ__PRINTF_VALIST_BY_REF,
+ (uintptr_t)format,
+ (uintptr_t)&vargs,
+ 0, 0, 0);
+#else
+ _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
+ VG_USERREQ__PRINTF_VALIST_BY_REF,
+ (unsigned long)format,
+ (unsigned long)&vargs,
+ 0, 0, 0);
+#endif
+ va_end(vargs);
+ return (int)_qzz_res;
+#endif /* NVALGRIND */
+}
+
+#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
+static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
+ __attribute__((format(__printf__, 1, 2), __unused__));
+#endif
+static int
+#if defined(_MSC_VER)
+__inline
+#endif
+VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
+{
+#if defined(NVALGRIND)
+ return 0;
+#else /* NVALGRIND */
+#if defined(_MSC_VER)
+ uintptr_t _qzz_res;
+#else
+ unsigned long _qzz_res;
+#endif
+ va_list vargs;
+ va_start(vargs, format);
+#if defined(_MSC_VER)
+ _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
+ VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
+ (uintptr_t)format,
+ (uintptr_t)&vargs,
+ 0, 0, 0);
+#else
+ _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
+ VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
+ (unsigned long)format,
+ (unsigned long)&vargs,
+ 0, 0, 0);
+#endif
+ va_end(vargs);
+ return (int)_qzz_res;
+#endif /* NVALGRIND */
+}
+
+
+/* These requests allow control to move from the simulated CPU to the
+ real CPU, calling an arbitary function.
+
+ Note that the current ThreadId is inserted as the first argument.
+ So this call:
+
+ VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
+
+ requires f to have this signature:
+
+ Word f(Word tid, Word arg1, Word arg2)
+
+ where "Word" is a word-sized type.
+
+ Note that these client requests are not entirely reliable. For example,
+ if you call a function with them that subsequently calls printf(),
+ there's a high chance Valgrind will crash. Generally, your prospects of
+ these working are made higher if the called function does not refer to
+ any global variables, and does not refer to any libc or other functions
+ (printf et al). Any kind of entanglement with libc or dynamic linking is
+ likely to have a bad outcome, for tricky reasons which we've grappled
+ with a lot in the past.
+*/
+#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
+ VG_USERREQ__CLIENT_CALL0, \
+ _qyy_fn, \
+ 0, 0, 0, 0)
+
+#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
+ VG_USERREQ__CLIENT_CALL1, \
+ _qyy_fn, \
+ _qyy_arg1, 0, 0, 0)
+
+#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
+ VG_USERREQ__CLIENT_CALL2, \
+ _qyy_fn, \
+ _qyy_arg1, _qyy_arg2, 0, 0)
+
+#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
+ VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
+ VG_USERREQ__CLIENT_CALL3, \
+ _qyy_fn, \
+ _qyy_arg1, _qyy_arg2, \
+ _qyy_arg3, 0)
+
+
+/* Counts the number of errors that have been recorded by a tool. Nb:
+ the tool must record the errors with VG_(maybe_record_error)() or
+ VG_(unique_error)() for them to be counted. */
+#define VALGRIND_COUNT_ERRORS \
+ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ 0 /* default return */, \
+ VG_USERREQ__COUNT_ERRORS, \
+ 0, 0, 0, 0, 0)
+
+/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing
+ when heap blocks are allocated in order to give accurate results. This
+ happens automatically for the standard allocator functions such as
+ malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete,
+ delete[], etc.
+
+ But if your program uses a custom allocator, this doesn't automatically
+ happen, and Valgrind will not do as well. For example, if you allocate
+ superblocks with mmap() and then allocates chunks of the superblocks, all
+ Valgrind's observations will be at the mmap() level and it won't know that
+ the chunks should be considered separate entities. In Memcheck's case,
+ that means you probably won't get heap block overrun detection (because
+ there won't be redzones marked as unaddressable) and you definitely won't
+ get any leak detection.
+
+ The following client requests allow a custom allocator to be annotated so
+ that it can be handled accurately by Valgrind.
+
+ VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated
+ by a malloc()-like function. For Memcheck (an illustrative case), this
+ does two things:
+
+ - It records that the block has been allocated. This means any addresses
+ within the block mentioned in error messages will be
+ identified as belonging to the block. It also means that if the block
+ isn't freed it will be detected by the leak checker.
+
+ - It marks the block as being addressable and undefined (if 'is_zeroed' is
+ not set), or addressable and defined (if 'is_zeroed' is set). This
+ controls how accesses to the block by the program are handled.
+
+ 'addr' is the start of the usable block (ie. after any
+ redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator
+ can apply redzones -- these are blocks of padding at the start and end of
+ each block. Adding redzones is recommended as it makes it much more likely
+ Valgrind will spot block overruns. `is_zeroed' indicates if the memory is
+ zeroed (or filled with another predictable value), as is the case for
+ calloc().
+
+ VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
+ heap block -- that will be used by the client program -- is allocated.
+ It's best to put it at the outermost level of the allocator if possible;
+ for example, if you have a function my_alloc() which calls
+ internal_alloc(), and the client request is put inside internal_alloc(),
+ stack traces relating to the heap block will contain entries for both
+ my_alloc() and internal_alloc(), which is probably not what you want.
+
+ For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
+ custom blocks from within a heap block, B, that has been allocated with
+ malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
+ -- the custom blocks will take precedence.
+
+ VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For
+ Memcheck, it does two things:
+
+ - It records that the block has been deallocated. This assumes that the
+ block was annotated as having been allocated via
+ VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued.
+
+ - It marks the block as being unaddressable.
+
+ VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
+ heap block is deallocated.
+
+ VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For
+ Memcheck, it does four things:
+
+ - It records that the size of a block has been changed. This assumes that
+ the block was annotated as having been allocated via
+ VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued.
+
+ - If the block shrunk, it marks the freed memory as being unaddressable.
+
+ - If the block grew, it marks the new area as undefined and defines a red
+ zone past the end of the new block.
+
+ - The V-bits of the overlap between the old and the new block are preserved.
+
+ VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block
+ and before deallocation of the old block.
+
+ In many cases, these three client requests will not be enough to get your
+ allocator working well with Memcheck. More specifically, if your allocator
+ writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call
+ will be necessary to mark the memory as addressable just before the zeroing
+ occurs, otherwise you'll get a lot of invalid write errors. For example,
+ you'll need to do this if your allocator recycles freed blocks, but it
+ zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK).
+ Alternatively, if your allocator reuses freed blocks for allocator-internal
+ data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary.
+
+ Really, what's happening is a blurring of the lines between the client
+ program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the
+ memory should be considered unaddressable to the client program, but the
+ allocator knows more than the rest of the client program and so may be able
+ to safely access it. Extra client requests are necessary for Valgrind to
+ understand the distinction between the allocator and the rest of the
+ program.
+
+ Ignored if addr == 0.
+*/
+#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \
+ addr, sizeB, rzB, is_zeroed, 0)
+
+/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
+ Ignored if addr == 0.
+*/
+#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \
+ addr, oldSizeB, newSizeB, rzB, 0)
+
+/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details.
+ Ignored if addr == 0.
+*/
+#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \
+ addr, rzB, 0, 0, 0)
+
+/* Create a memory pool. */
+#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
+ pool, rzB, is_zeroed, 0, 0)
+
+/* Destroy a memory pool. */
+#define VALGRIND_DESTROY_MEMPOOL(pool) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \
+ pool, 0, 0, 0, 0)
+
+/* Associate a piece of memory with a memory pool. */
+#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \
+ pool, addr, size, 0, 0)
+
+/* Disassociate a piece of memory from a memory pool. */
+#define VALGRIND_MEMPOOL_FREE(pool, addr) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \
+ pool, addr, 0, 0, 0)
+
+/* Disassociate any pieces outside a particular range. */
+#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \
+ pool, addr, size, 0, 0)
+
+/* Resize and/or move a piece associated with a memory pool. */
+#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \
+ poolA, poolB, 0, 0, 0)
+
+/* Resize and/or move a piece associated with a memory pool. */
+#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \
+ pool, addrA, addrB, size, 0)
+
+/* Return 1 if a mempool exists, else 0. */
+#define VALGRIND_MEMPOOL_EXISTS(pool) \
+ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
+ VG_USERREQ__MEMPOOL_EXISTS, \
+ pool, 0, 0, 0, 0)
+
+/* Mark a piece of memory as being a stack. Returns a stack id. */
+#define VALGRIND_STACK_REGISTER(start, end) \
+ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
+ VG_USERREQ__STACK_REGISTER, \
+ start, end, 0, 0, 0)
+
+/* Unmark the piece of memory associated with a stack id as being a
+ stack. */
+#define VALGRIND_STACK_DEREGISTER(id) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
+ id, 0, 0, 0, 0)
+
+/* Change the start and end address of the stack id. */
+#define VALGRIND_STACK_CHANGE(id, start, end) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \
+ id, start, end, 0, 0)
+
+/* Load PDB debug info for Wine PE image_map. */
+#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
+ fd, ptr, total_size, delta, 0)
+
+/* Map a code address to a source file name and line number. buf64
+ must point to a 64-byte buffer in the caller's address space. The
+ result will be dumped in there and is guaranteed to be zero
+ terminated. If no info is found, the first byte is set to zero. */
+#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
+ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
+ VG_USERREQ__MAP_IP_TO_SRCLOC, \
+ addr, buf64, 0, 0, 0)
+
+/* Disable error reporting for this thread. Behaves in a stack like
+ way, so you can safely call this multiple times provided that
+ VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times
+ to re-enable reporting. The first call of this macro disables
+ reporting. Subsequent calls have no effect except to increase the
+ number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable
+ reporting. Child threads do not inherit this setting from their
+ parents -- they are always created with reporting enabled. */
+#define VALGRIND_DISABLE_ERROR_REPORTING \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
+ 1, 0, 0, 0, 0)
+
+/* Re-enable error reporting, as per comments on
+ VALGRIND_DISABLE_ERROR_REPORTING. */
+#define VALGRIND_ENABLE_ERROR_REPORTING \
+ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
+ -1, 0, 0, 0, 0)
+
+#undef PLAT_x86_darwin
+#undef PLAT_amd64_darwin
+#undef PLAT_x86_win32
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_arm_linux
+#undef PLAT_s390x_linux
+#undef PLAT_mips32_linux
+
+#endif /* __VALGRIND_H */
diff --git a/glib/glib/win_iconv.c b/glib/glib/win_iconv.c
index 4ab1653..7a55c0a 100644
--- a/glib/glib/win_iconv.c
+++ b/glib/glib/win_iconv.c
@@ -77,7 +77,7 @@ typedef void* iconv_t;
iconv_t iconv_open(const char *tocode, const char *fromcode);
int iconv_close(iconv_t cd);
-size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+size_t iconv(iconv_t cd, /* const */ char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
/* libiconv interface for vim */
#if defined(MAKE_DLL)
@@ -95,7 +95,7 @@ typedef struct rec_iconv_t rec_iconv_t;
typedef iconv_t (*f_iconv_open)(const char *tocode, const char *fromcode);
typedef int (*f_iconv_close)(iconv_t cd);
-typedef size_t (*f_iconv)(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+typedef size_t (*f_iconv)(iconv_t cd, /* const */ char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
typedef int* (*f_errno)(void);
typedef int (*f_mbtowc)(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
typedef int (*f_wctomb)(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
@@ -137,9 +137,9 @@ struct rec_iconv_t {
static int win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode);
static int win_iconv_close(iconv_t cd);
-static size_t win_iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+static size_t win_iconv(iconv_t cd, /* const */ char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
-static int load_mlang();
+static int load_mlang(void);
static csconv_t make_csconv(const char *name);
static int name_to_codepage(const char *name);
static uint utf16_to_ucs4(const ushort *wbuf);
@@ -704,7 +704,7 @@ static LCIDTORFC1766A LcidToRfc1766A;
static RFC1766TOLCIDA Rfc1766ToLcidA;
static int
-load_mlang()
+load_mlang(void)
{
HMODULE h = NULL;
char mlang_dll[MAX_PATH + 100];
@@ -772,7 +772,7 @@ iconv_close(iconv_t _cd)
}
size_t
-iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
+iconv(iconv_t _cd, /* const */ char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
{
rec_iconv_t *cd = (rec_iconv_t *)_cd;
size_t r = cd->iconv(cd->cd, inbuf, inbytesleft, outbuf, outbytesleft);
@@ -801,7 +801,7 @@ win_iconv_close(iconv_t cd)
}
static size_t
-win_iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
+win_iconv(iconv_t _cd, /* const */ char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
{
rec_iconv_t *cd = (rec_iconv_t *)_cd;
ushort wbuf[MB_CHAR_MAX]; /* enough room for one character */
diff --git a/glib/m4macros/Makefile.am b/glib/m4macros/Makefile.am
index 10a2f5f..0e6164c 100644
--- a/glib/m4macros/Makefile.am
+++ b/glib/m4macros/Makefile.am
@@ -1,4 +1,4 @@
-include $(top_srcdir)/Makefile.decl
+include $(top_srcdir)/glib.mk
installed_m4= glib-2.0.m4 glib-gettext.m4 gsettings.m4
diff --git a/glib/m4macros/attributes.m4 b/glib/m4macros/attributes.m4
new file mode 100644
index 0000000..f0bcf24
--- /dev/null
+++ b/glib/m4macros/attributes.m4
@@ -0,0 +1,288 @@
+dnl Macros to check the presence of generic (non-typed) symbols.
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
+dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+dnl
+dnl As a special exception, the copyright owners of the
+dnl macro gives unlimited permission to copy, distribute and modify the
+dnl configure scripts that are the output of Autoconf when processing the
+dnl Macro. You need not follow the terms of the GNU General Public
+dnl License when using or distributing such scripts, even though portions
+dnl of the text of the Macro appear in them. The GNU General Public
+dnl License (GPL) does govern all other use of the material that
+dnl constitutes the Autoconf Macro.
+dnl
+dnl This special exception to the GPL applies to versions of the
+dnl Autoconf Macro released by this project. When you make and
+dnl distribute a modified version of the Autoconf Macro, you may extend
+dnl this special exception to the GPL to apply to your modified version as
+dnl well.
+
+dnl Check if FLAG in ENV-VAR is supported by compiler and append it
+dnl to WHERE-TO-APPEND variable
+dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
+
+AC_DEFUN([CC_CHECK_FLAG_APPEND], [
+ AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
+ AS_TR_SH([cc_cv_$2_$3]),
+ [eval "AS_TR_SH([cc_save_$2])='${$2}'"
+ eval "AS_TR_SH([$2])='-Werror $3'"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
+ [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
+ [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
+ eval "AS_TR_SH([$2])='$cc_save_$2'"])
+
+ AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
+ [eval "$1='${$1} $3'"])
+])
+
+dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
+AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
+ for flag in $3; do
+ CC_CHECK_FLAG_APPEND($1, $2, $flag)
+ done
+])
+
+dnl Check if the flag is supported by linker (cacheable)
+dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+
+AC_DEFUN([CC_CHECK_LDFLAGS], [
+ AC_CACHE_CHECK([if $CC supports $1 flag],
+ AS_TR_SH([cc_cv_ldflags_$1]),
+ [ac_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $1"
+ AC_LINK_IFELSE([int main() { return 1; }],
+ [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
+ [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
+ LDFLAGS="$ac_save_LDFLAGS"
+ ])
+
+ AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+ [$2], [$3])
+])
+
+dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
+dnl the current linker to avoid undefined references in a shared object.
+AC_DEFUN([CC_NOUNDEFINED], [
+ dnl We check $host for which systems to enable this for.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ case $host in
+ dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
+ dnl are requested, as different implementations are present; to avoid problems
+ dnl use -Wl,-z,defs only for those platform not behaving this way.
+ *-freebsd* | *-openbsd*) ;;
+ *)
+ dnl First of all check for the --no-undefined variant of GNU ld. This allows
+ dnl for a much more readable commandline, so that people can understand what
+ dnl it does without going to look for what the heck -z defs does.
+ for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+ CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
+ break
+ done
+ ;;
+ esac
+
+ AC_SUBST([LDFLAGS_NOUNDEFINED])
+])
+
+dnl Check for a -Werror flag or equivalent. -Werror is the GCC
+dnl and ICC flag that tells the compiler to treat all the warnings
+dnl as fatal. We usually need this option to make sure that some
+dnl constructs (like attributes) are not simply ignored.
+dnl
+dnl Other compilers don't support -Werror per se, but they support
+dnl an equivalent flag:
+dnl - Sun Studio compiler supports -errwarn=%all
+AC_DEFUN([CC_CHECK_WERROR], [
+ AC_CACHE_CHECK(
+ [for $CC way to treat warnings as errors],
+ [cc_cv_werror],
+ [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
+ [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
+ ])
+])
+
+AC_DEFUN([CC_CHECK_ATTRIBUTE], [
+ AC_REQUIRE([CC_CHECK_WERROR])
+ AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
+ AS_TR_SH([cc_cv_attribute_$1]),
+ [ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cc_cv_werror"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
+ [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
+ [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
+ CFLAGS="$ac_save_CFLAGS"
+ ])
+
+ AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
+ [AC_DEFINE(
+ AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
+ [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
+ )
+ $4],
+ [$5])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
+ CC_CHECK_ATTRIBUTE(
+ [constructor],,
+ [void __attribute__((constructor)) ctor() { int a; }],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
+ CC_CHECK_ATTRIBUTE(
+ [format], [format(printf, n, n)],
+ [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
+ CC_CHECK_ATTRIBUTE(
+ [format_arg], [format_arg(printf)],
+ [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
+ CC_CHECK_ATTRIBUTE(
+ [visibility_$1], [visibility("$1")],
+ [void __attribute__((visibility("$1"))) $1_function() { }],
+ [$2], [$3])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
+ CC_CHECK_ATTRIBUTE(
+ [nonnull], [nonnull()],
+ [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
+ CC_CHECK_ATTRIBUTE(
+ [unused], ,
+ [void some_function(void *foo, __attribute__((unused)) void *bar);],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
+ CC_CHECK_ATTRIBUTE(
+ [sentinel], ,
+ [void some_function(void *foo, ...) __attribute__((sentinel));],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
+ CC_CHECK_ATTRIBUTE(
+ [deprecated], ,
+ [void some_function(void *foo, ...) __attribute__((deprecated));],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
+ CC_CHECK_ATTRIBUTE(
+ [alias], [weak, alias],
+ [void other_function(void *foo) { }
+ void some_function(void *foo) __attribute__((weak, alias("other_function")));],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
+ CC_CHECK_ATTRIBUTE(
+ [malloc], ,
+ [void * __attribute__((malloc)) my_alloc(int n);],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_PACKED], [
+ CC_CHECK_ATTRIBUTE(
+ [packed], ,
+ [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONST], [
+ CC_CHECK_ATTRIBUTE(
+ [const], ,
+ [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
+ [$1], [$2])
+])
+
+AC_DEFUN([CC_FLAG_VISIBILITY], [
+ AC_REQUIRE([CC_CHECK_WERROR])
+ AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
+ [cc_cv_flag_visibility],
+ [cc_flag_visibility_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cc_cv_werror"
+ CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
+ cc_cv_flag_visibility='yes',
+ cc_cv_flag_visibility='no')
+ CFLAGS="$cc_flag_visibility_save_CFLAGS"])
+
+ AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
+ [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
+ [Define this if the compiler supports the -fvisibility flag])
+ $1],
+ [$2])
+])
+
+AC_DEFUN([CC_FUNC_EXPECT], [
+ AC_REQUIRE([CC_CHECK_WERROR])
+ AC_CACHE_CHECK([if compiler has __builtin_expect function],
+ [cc_cv_func_expect],
+ [ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cc_cv_werror"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+ [int some_function() {
+ int a = 3;
+ return (int)__builtin_expect(a, 3);
+ }])],
+ [cc_cv_func_expect=yes],
+ [cc_cv_func_expect=no])
+ CFLAGS="$ac_save_CFLAGS"
+ ])
+
+ AS_IF([test "x$cc_cv_func_expect" = "xyes"],
+ [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
+ [Define this if the compiler supports __builtin_expect() function])
+ $1],
+ [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
+ AC_REQUIRE([CC_CHECK_WERROR])
+ AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
+ [cc_cv_attribute_aligned],
+ [ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cc_cv_werror"
+ for cc_attribute_align_try in 64 32 16 8 4 2; do
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+ int main() {
+ static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
+ return c;
+ }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+ done
+ CFLAGS="$ac_save_CFLAGS"
+ ])
+
+ if test "x$cc_cv_attribute_aligned" != "x"; then
+ AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
+ [Define the highest alignment supported])
+ fi
+])
diff --git a/glib/m4macros/glib-gettext.m4 b/glib/m4macros/glib-gettext.m4
index c64e64f..5217fd8 100644
--- a/glib/m4macros/glib-gettext.m4
+++ b/glib/m4macros/glib-gettext.m4
@@ -315,7 +315,6 @@ msgstr ""
dnl
glib_DEFUN([GLIB_GNU_GETTEXT],
[AC_REQUIRE([AC_PROG_CC])dnl
- AC_REQUIRE([AC_HEADER_STDC])dnl
GLIB_LC_MESSAGES
GLIB_WITH_NLS
diff --git a/glib/m4macros/glibtests.m4 b/glib/m4macros/glibtests.m4
new file mode 100644
index 0000000..27e9024
--- /dev/null
+++ b/glib/m4macros/glibtests.m4
@@ -0,0 +1,28 @@
+dnl GLIB_TESTS
+dnl
+
+AC_DEFUN([GLIB_TESTS],
+[
+ AC_ARG_ENABLE(installed-tests,
+ AS_HELP_STRING([--enable-installed-tests],
+ [Enable installation of some test cases]),
+ [case ${enableval} in
+ yes) ENABLE_INSTALLED_TESTS="1" ;;
+ no) ENABLE_INSTALLED_TESTS="" ;;
+ *) AC_MSG_ERROR([bad value ${enableval} for --enable-installed-tests]) ;;
+ esac])
+ AM_CONDITIONAL([ENABLE_INSTALLED_TESTS], test "$ENABLE_INSTALLED_TESTS" = "1")
+ AC_ARG_ENABLE(always-build-tests,
+ AS_HELP_STRING([--enable-always-build-tests],
+ [Enable always building tests during 'make all']),
+ [case ${enableval} in
+ yes) ENABLE_ALWAYS_BUILD_TESTS="1" ;;
+ no) ENABLE_ALWAYS_BUILD_TESTS="" ;;
+ *) AC_MSG_ERROR([bad value ${enableval} for --enable-always-build-tests]) ;;
+ esac])
+ AM_CONDITIONAL([ENABLE_ALWAYS_BUILD_TESTS], test "$ENABLE_ALWAYS_BUILD_TESTS" = "1")
+ if test "$ENABLE_INSTALLED_TESTS" == "1"; then
+ AC_SUBST(installed_test_metadir, [${datadir}/installed-tests/]AC_PACKAGE_NAME)
+ AC_SUBST(installed_testdir, [${libexecdir}/installed-tests/]AC_PACKAGE_NAME)
+ fi
+])
diff --git a/glib/mkinstalldirs b/glib/mkinstalldirs
deleted file mode 100755
index 4191a45..0000000
--- a/glib/mkinstalldirs
+++ /dev/null
@@ -1,162 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-
-scriptversion=2009-04-28.21; # UTC
-
-# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain.
-#
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-nl='
-'
-IFS=" "" $nl"
-errstatus=0
-dirmode=
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
-
-Create each directory DIR (with mode MODE, if specified), including all
-leading file name components.
-
-Report bugs to <bug-automake@gnu.org>."
-
-# process command line arguments
-while test $# -gt 0 ; do
- case $1 in
- -h | --help | --h*) # -h for help
- echo "$usage"
- exit $?
- ;;
- -m) # -m PERM arg
- shift
- test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
- dirmode=$1
- shift
- ;;
- --version)
- echo "$0 $scriptversion"
- exit $?
- ;;
- --) # stop option processing
- shift
- break
- ;;
- -*) # unknown option
- echo "$usage" 1>&2
- exit 1
- ;;
- *) # first non-opt arg
- break
- ;;
- esac
-done
-
-for file
-do
- if test -d "$file"; then
- shift
- else
- break
- fi
-done
-
-case $# in
- 0) exit 0 ;;
-esac
-
-# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
-# mkdir -p a/c at the same time, both will detect that a is missing,
-# one will create a, then the other will try to create a and die with
-# a "File exists" error. This is a problem when calling mkinstalldirs
-# from a parallel make. We use --version in the probe to restrict
-# ourselves to GNU mkdir, which is thread-safe.
-case $dirmode in
- '')
- if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
- echo "mkdir -p -- $*"
- exec mkdir -p -- "$@"
- else
- # On NextStep and OpenStep, the `mkdir' command does not
- # recognize any option. It will interpret all options as
- # directories to create, and then abort because `.' already
- # exists.
- test -d ./-p && rmdir ./-p
- test -d ./--version && rmdir ./--version
- fi
- ;;
- *)
- if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
- test ! -d ./--version; then
- echo "mkdir -m $dirmode -p -- $*"
- exec mkdir -m "$dirmode" -p -- "$@"
- else
- # Clean up after NextStep and OpenStep mkdir.
- for d in ./-m ./-p ./--version "./$dirmode";
- do
- test -d $d && rmdir $d
- done
- fi
- ;;
-esac
-
-for file
-do
- case $file in
- /*) pathcomp=/ ;;
- *) pathcomp= ;;
- esac
- oIFS=$IFS
- IFS=/
- set fnord $file
- shift
- IFS=$oIFS
-
- for d
- do
- test "x$d" = x && continue
-
- pathcomp=$pathcomp$d
- case $pathcomp in
- -*) pathcomp=./$pathcomp ;;
- esac
-
- if test ! -d "$pathcomp"; then
- echo "mkdir $pathcomp"
-
- mkdir "$pathcomp" || lasterr=$?
-
- if test ! -d "$pathcomp"; then
- errstatus=$lasterr
- else
- if test ! -z "$dirmode"; then
- echo "chmod $dirmode $pathcomp"
- lasterr=
- chmod "$dirmode" "$pathcomp" || lasterr=$?
-
- if test ! -z "$lasterr"; then
- errstatus=$lasterr
- fi
- fi
- fi
- fi
-
- pathcomp=$pathcomp/
- done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End: